iOS之《Effective Objective-C 2.0》读书笔记(22)

来源:互联网 发布:美图秀秀mac官方下载 编辑:程序博客网 时间:2024/06/05 14:10

第22条:理解NSCopying协议

1.哪些具体的代码用到了NSCopying协议呢?

  • 以NSArray为例:
// 对NSArray进行操作NSArray *typeArray = @[@"A", @"B", @"C"];NSArray *copyArray = [typeArray copy];  // 指针拷贝NSMutableArray *mutableCopyArray = [typeArray mutableCopy];//内容拷贝//对NSMutableArray进行操作NSMutableArray *numArray = [NSMutableArray arrayWithObject:@"1",@"2",@"3"];NSArray *copyArray0 = [numArray copy];//内容拷贝NSMutableArray *mutableCopyArray0 = [array numArray];//内容拷贝
  • 具体解释:
 1>调用copy方法时:就会调用- (id)copyWithZone:(NSZone *)zone,得到不可变的对象,该方法即NSCopying的协议方法 2>调用mutableCopy方法时:就会调用- (id)mutableCopyWithZone:(NSZone *)zone,得到可变的对象,该方法即NSMutableCopying的协议方法 3>Foundation类已经遵守了两种协议,且实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建不可变对象或可变对象,自定义类时需要遵守协议并且手动实现协议方法

2.进一步了解NSCopying和NSMutableCopying协议

(1)NSCopying:让一个类的对象支持浅拷 ; NSMutableCopying:让一个类的对象支持深拷贝
(2)NSCopying中唯一的协议方法:

  • NSZone的由来:之前开发程序,会把内存分为不同的“区(zone)”,而对象会创建在某个区里面,现在每个程序都只有一个区:“默认区”,所以zone参数已经没有什么实际意义了
- (id)copyWithZone:(NSZone *)zone

(3)重写该协议:

  • 具体重写方式:
- (id)copyWithZone:(NSZone *)zone{            PersonModel *model = [[[self class] allocWithZone:zone] init];        model.firstName = self.firstName;        model.lastName  = self.lastName;     return model;}
  • 具体说明:一定要通过[self class]方法返回的对象调用allocWithZone:方法。因为指针可能实际指向的是PersonModel的子类。这种情况下,通过调用[self class],就可以返回正确的类的类型对象,且该类直接继承自NSObject,无需调用[super copyWithZone:zone]

3.NSCopying与NSMutableCopying的联系

(1)自定义的对象分为可变与不可变,则同时实现这两个协议
(2)一般情况下,尽量使用浅拷贝
(3)如果你写的对象需要深拷贝,可考虑新增一个专门执行深拷贝的方法
(4)两者的区别如下图:
aaa

4.常见面试题:定义NSString属性时,是使用copy还是strong,为什么? 参考

@interface Person : NSObject @property (nonatomic, copy) NSString *familyname;@property (nonatomic, strong) NSString *nickname;@endPerson *p1 = [[Person alloc]init];NSMutableString *familyname = [[NSMutableString alloc]initWithString:@"张三"];p1.familyname = familyname;[familyname appendString:@"峰"];NSLog(@"p1.familyname is %@",p1.familyname);  //p1.familyname is 张三NSMutableString *nickname = [[NSMutableString alloc]initWithString:@"二狗"];p1.nickname = nickname;[nickname appendString:@"蛋儿"];NSLog(@"p1.nickname is %@", p1.nickname);//p1.nickname is 二狗蛋儿
阅读全文
0 0
原创粉丝点击