天天看點

ios copy關鍵字的使用

轉自:http://jordy.easymorse.com/?cat=26

copy關鍵字的使用

平時我們使用對象之間的傳值都是采用retain count +1的方式,這種方式的适用于當對象的某屬性的值改變時,引用該對象的不同指針會同時改變,因為這兩個指針指向的是同一個記憶體位址,

但如果需求是,當一個指針執行的對象屬性值發生改變時,不影響另一個對象,那麼需要配置設定兩個不同的記憶體位址,也就是說,我們就不可以采用retain關鍵字了,而是要采用copy 關鍵字,因為copy關鍵字會在複制時重新建立一個新的對象。 舉例說明一下copy使用

這裡建立一個Person類

Person.h,代碼:

@interface Person : NSObject <NSCopying>{

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,其次需要實作<NSCoding>協定,最後在方法中實作

- (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];