为啥NSString的属性要用copy而不用ios copy retainn

ios平台(68)
NSString 为什么要使用copy,而不是retain
1、首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好
2、但是使用copy安全。因为NSString为NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们希望的,所以NSString要使用copy。
block为什么使用copy来修饰?
  在MRC下,任何block,都是存在于栈中,这也意味着,其生命周期由系统管理,不需要我们手动管理.这就存在一个问题,那就是我们如果使用block保存一段代码块,欢乐的等待被回调的时候,说不定在之前就已经被系统回收了!
但是ARC下, 使用Strong, Copy修饰Block都是可行的, 都是使Block存在在堆区, 官方建议还是使用copy,
但是使用retain就不一样了, 使用retain修饰Block相当于使用 (如果使用retain的话,只会将其计数器加一, 多做一次强引用,但不会重新分配新的内存).
block中使用的
NSLog(@"%@",_name);
NSLog(@"%@",self-&_name);
NSLog(@"%@",self.name);
都会引发循环引用,其中15与16行,是等同的;
因为,block存在于堆中,在其代码块中引用的对象都会产生一个強指针.而这时候问题就产生了,因为block本身就被其引用的对象(copy)强指针指向着.这样就造成了双方都无法释放,从而造成了内存泄漏.
self.block (copy) 强引用
block 强引用
双方都被对方强引用着, 无法释放
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17815次
排名:千里之外
原创:72篇
转载:15篇
(1)(4)(5)(6)(11)(23)(14)(18)(8)ObjC中property属性Retain的和Copy的区别【转载自southking】
因为如果你用retain,
你保证不了调用者是给你传的是NSString还是NSMutableString,&
如果传的是NSMutableString,
那你的这个NSString属性内容就有可能受调用者的影响,&
而NSString的属性,通常都是不希望被调用者改变的。&
不只是NSString,其他的不可变类, NSArray, NSDictionary,
NSSet等,都是推荐用copy的.&
并且对于copy的属性,如果你传的是NSString, NSString
的copy实现就是retain,&
如果传的是NSMutableString,
它的copy才是真的按字节拷贝。&
所以对于copy属性,不用担心其性能。&
故对于不可变类的类型属性,放心的一律用copy属性吧.&
以上如果说的还是抽象的话,写个代码看看,比如.&
@interface&Person&&
@property&(nonatomic,&retain)&NSString&*&&
Person&*p&=&[[Person&alloc]&init];&&
NSMutableString&*name&=&[[NSMutableString&alloc]&initWithString:@"hello"];&&
p.name&=&&&
[name&appendString:@"&world"];&&
NSLog(@"%@",&p.name);&&//&此时p.name已变成hello&world,&这不是我们想要的。&&
@interface&Person&&
@property&(nonatomic,&copy)&NSString&*&&
Person&*p&=&[[Person&alloc]&init];&&
NSMutableString&*name&=&[[NSMutableString&alloc]&initWithString:@"hello"];&&
p.name&=&&&
[name&appendString:@"&world"];&&
NSLog(@"%@",&p.name);&&//&此时p.name仍为hello,&这是正确的。&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。& &之前学习生活中,知道NSString的属性要用copy而不用retain,可是不知道为啥,这两天我研究了一下,然后最终明确了.
详细原因是由于用copy比用retain安全,当是NSString的时候,其有用copy和retain都行,当用NSMutableString,那么就要用copy,NSMutableString的值不会被改动,而用retain的时候,NSMutableString的值会被改动,详细情况,能够看以下的代码:
#import &Foundation/Foundation.h&
//协议有两种方式,第一是以ing结尾形式,第二,以delegate结尾形式
@interface person : NSObject&NSCopying&
@property (nonatomic,copy)NSString *
person * p
= [[person alloc]init];
NSMutableString * name = [[NSMutableString alloc]initWithString:@&hello&];
[name appendString:@& word&];
NSLog(@&%@&,p.name);
打印后结果是
17:08:44.170 DepthCopy[] hello
Program ended with exit code: 0
我们能够发现打印结果还是
再看以下用retain
#import &Foundation/Foundation.h&
//协议有两种方式,第一是以ing结尾形式,第二,以delegate结尾形式
@interface person : NSObject&NSCopying&
@property (nonatomic,retain)NSString *
person * p
= [[person alloc]init];
NSMutableString * name = [[NSMutableString alloc]initWithString:@&hello&];
[name appendString:@& word&];
NSLog(@&%@&,p.name);
打印结果是: 17:13:19.531 DepthCopy[] hello word
Program ended with exit code: 0
我们能够发现结果被改变了,成为了
所以,由以上代码,能够看出copy比retain安全,也就能明确为啥NSString的属性要用copy而不用retain了;
阅读(...) 评论()什么情况下用retain和copy
copy: 建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
那上面的是什么意思呢?
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSArray对象,地址为11111,内容为xx
Copy到另外一个NSArray之 后,地址为22222,内容相同,新的对象retain为1, 旧有对象没有变化
retain到另外一个NSArray之 后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。
什么情况下用assign,什么情况下用retain,什么情况下用copy?
assign:凡是不是拥有的关系,应该使用assign,而不是retain或copy。
retain或copy:当类拥有mutable子类时,你应该使用copy,而不是retain。
例如:NSAArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 strong copy retain 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信