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)两者的区别如下图:
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
- iOS之《Effective Objective-C 2.0》读书笔记(22)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- Java程序发送邮件
- JSON进阶第三篇 apache多域名及JSON的跨域问题(JSONP)
- PHP读写XML文件
- PHP画图基础
- python+selenium中的wait事件
- iOS之《Effective Objective-C 2.0》读书笔记(22)
- PHP 画图应用 验证码 柱状图
- 改进的筛素数法
- 位操作基础篇之位操作全面总结
- 进程通信之二 管道技术第一篇 输入输出的重定向
- 进程通信之二 管道技术第二篇 匿名管道
- 问题 C: 哈希计划
- 秒杀多线程第一篇 多线程笔试面试题汇总
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别