平時我們使用對象之間的傳值都是采用retain count +1的方式,這種方式的適用於當對象的某屬性的值改變時,引用該對象的不同指針會同時改變,因為這兩個指針指向的是同一個內存地址,
但如果需求是,當一個指針執行的對象屬性值發生改變時,不影響另一個對象,那麼需要分配兩個不同的內存地址,也就是說,我們就不可以采用retain關鍵字了,而是要采用copy 關鍵字,因為copy關鍵字會在復制時重新創建一個新的對象。 舉例說明一下copy使用
這裡創建一個Person類
Person.h,代碼:
@interface Person : NSObject
{
NSString *name;
NSString *email;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic,retain)NSString *email;
@end
Person.m文件
#import “Person.h”
@synthesize name,email;
- (id)initWithName:(NSString *)theName andEmail:(NSString *)theEmail
{
self = [super init];
if (self){
self.name = theName;
self.email = theEmail;
}
}
- (id)copyWithZone:(NSZone *)zone
{
Person *aPerson = [[Person allocWithZone:zone] initWithName:[self name] andEmail:[self email]];
return aPerson;
}
- (void)delloc
{
[name release];
[email release];
[super dealloc];
}
這裡說明一下,
在對象之間copy,首先需要類是繼承自NSObject,其次需要實現協議,最後在方法中實現
- (id)copyWithZone:(NSZone *)zone 方法
如果沒有此方法那麼在copy對象,程序會直接宕機,並提示Person類找不到copyWithZone方法。
這裡還有一點需要注意的是,通常在NSArray之間copy,是retain方式的復制,也就是直接將引用系數+1,
如下 代碼:
NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];
NSMutableArray *array2 = [array1 copy]; 或使用
NSMutableArray *array2 =[ [NSMutableArray alloc] initWithArray:array1];
如果想使用兩個不同內存,那麼就需要使用到NSArray 的deep copy,例如:
NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];
NSMutableArray *array2 = [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];