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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

  • copy/mutableCopy NSString
N`RNCLKQ1I~2(`(P[7Q.png

N`RNCLKQ1I~2(`(P[7Q.png

  • copy/mutableCopy NSMutableString
H}B@N[~QW8(3WS{%KNPMHNE.png
N`RNCLKQ1I~2(`(P[7Q.png
结论:
N`RNCLKQ1I~2(`(P[7Q.png
注意:其他对象NSArray、NSMutableArray 、NSDictionary、NSMutableDictionary一样适用
N`RNCLKQ1I~2(`(P[7Q.png
  • copy NSObject
F]DJK]3Z~N{U788]_(`3.png
崩溃:
F]DJK]3Z~N{U788]_(`3.png
看崩溃信息HSPerson应该先实现:

)`07D[FE5(MP2CKIF]F1LHY.png
测试:
J}98CVU038Y_9O{0EOMJ5_G.png
J}98CVU038Y_9O{0EOMJ5_G.png

可以看出copyWithZone重新分配新的内存空间,则:
TYI1`3QX5(0G]81[8T~VX2U.png
J}98CVU038Y_9O{0EOMJ5_G.png
虽然copy了份新的对象,然而age,height值并未copy,那么:
8A{8387PWF{4LZRH_~RZO1J.png

295346-652a9c24134b58ed.png
这时你会想,有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
_J%L_SD26A%P~H7QQ[[{3SA.png

295346-652a9c24134b58ed.png
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的方法,就会崩溃:
295346-652a9c24134b58ed.png

  • 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);

295346-652a9c24134b58ed.png
原文出自:简书

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

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




0 个回复

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