A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【iOS开发基础(一)】你必须要知道的深.浅拷贝

  • copy/mutableCopy NSString


  • copy/mutableCopy NSMutableString


结论:

注意:其他对象NSArray、NSMutableArray 、NSDictionary、NSMutableDictionary一样适用

  • copy NSObject

崩溃:

看崩溃信息HSPerson应该先实现:


测试:



可以看出copyWithZone重新分配新的内存空间,则:


虽然copy了份新的对象,然而age,height值并未copy,那么:



这时你会想,有NSMutableCopying?没错,是有这货:
- (id)mutableCopyWithZone:(NSZone *)zone{    HSPerson *person = [[HSPerson allocWithZone:zone] init];    person.age = self.age;    person.height = self.height;    return person;}


NSCopying、NSMutableCopying有啥区别?
其实感觉没必要有NSMutableCopying,因为压根就没可变的HSPerson,但如果该对象有其他行为,可以借用NSMutableCopying实现,哈哈哈


property里的copy、strong区别
说完深浅拷贝,理解property里的copy、strong就轻松多了!
  • copy



property copy 实际上就对name干了这个:
- (void)setName:(NSString *)name{    _name = [name copy];}
假设name为NSMutableString,会发生什么事?
@property (nonatomic, copy) NSMutableString *name;


这样会挨骂哦,实际上内部还是:
- (void)setName:(NSMutableString *)name{    _name = [name copy];}
copy出来的仍然是不可变字符!如果有人用NSMutableString的方法,就会崩溃:


  • strong
@property (nonatomic, strong) NSString *name;


NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];HSPerson *person = [[HSPerson alloc] init];person.name = string;// 可以改变person.name的值,因为其内部没有生成新的对象[string appendString:@" hans"];NSLog(@"name = %@", person.name);


原文出自:简书

原文链接:http://www.jianshu.com/p/e6a7cdcc705d

                                               黑马出品,必属精品
                                    
更多精品资源推荐
                《2017年最新iOS开发完整版学习路线图 》听说,用过的人都说好,你不试试吗?




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马