首 先,從copy開始說(shuō),簡(jiǎn)而言之,copy的目的就是生成一個(gè)新的實(shí)例,然后把其成員都按原實(shí)例賦值。對(duì)于非指針型的成員,比如BOOL, int, float,這樣的賦值可以直接進(jìn)行。但是對(duì)于指針型的數(shù)據(jù),比如Objc中用到的對(duì)象,就有Deep Copy和Shallow Copy的區(qū)別——這個(gè)和在C++中的基本上是一樣的:是生成新的成員對(duì)象,或是指向同一成員對(duì)象。了 解了這點(diǎn)以后,再看看Copy在Objetive-C中的實(shí)現(xiàn)方式。如果要調(diào)用一個(gè)對(duì)象的copy方法,這個(gè)對(duì)象必須遵循NSCopying的協(xié)議。這個(gè) 協(xié)議中規(guī)定了一個(gè)方法:- (id)copyWithZone:(NSZone *)zone;我們就是通過(guò)實(shí)現(xiàn)這個(gè)方法給對(duì)象提供拷貝的功能。對(duì)于很多現(xiàn)有類,如NSString,NSDictionary,。。。這個(gè)方法已經(jīng)實(shí) 現(xiàn)。假設(shè)我們現(xiàn)在自定義了一個(gè)類,需要為這個(gè)類提供拷貝的功能,就需要自己來(lái)動(dòng)手寫CopyWithZone的方法:示例如下:
@interface PRoduct()<NSCopying>@property(nonatomic,weak)id<NSCopying>delegate;@end@implementation Product-(instancetype)initWithName:(NSString*)name Address:(NSString*)address{ if (self = [super init]) { self.name = name; self.Address = address; } return self;}-(id)copyWithZone:(NSZone *)zone{ Product *product = [[Product alloc]initWithName:self.name Address:self.Address]; [product setDelegate:[self delegate]]; return product;}使用
Product *p1 = [[Product alloc]initWithName:@"BOB" Address:@"beijin"]; Product *p2 = [p1 copy]; NSLog(@"p1.add=%p,%@,p2.add=%p,%@",p1,p1.name,p2,p2.name);打印出來(lái)的對(duì)象地址是不同的,但是內(nèi)容是一樣的
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注