ios – 将nil分配给保留属性会释放与之关联的对象吗?

ios – 将nil分配给保留属性会释放与之关联的对象吗?,第1张

概述当不在ARC下时,对于以下代码, .H @property (nonatomic, retain) NSString *s; .M NSString *m = [NSString stringWithString:@"Hellow, World"];s = [m retain];// later ons = nil; <-- will this release the ref count 当不在ARC下时,对于以下代码,

.H

@property (nonatomic,retain) Nsstring *s;

.M

Nsstring *m = [Nsstring stringWithString:@"Hellow,World"];s = [m retain];// later ons = nil; <-- will this release the ref count on the string and hence get the string released?
解决方法 当像这样使用时(即通过直接访问实例变量),然后不,它不会.但是,如果你使用属性的访问器方法([self setS:nil];或self.s = nil;),那么是的,它会.

另请注意,释放对象并释放其内存是两件完全不同的事情.仅当对象没有更强的引用时才释放对象 – i.即你有最后一个引用它,然后你释放它.如果你释放它但它有其他引用(通过先前保留),那么它将不会被释放,只有它的引用计数将减1.

此外,如果你有一个保留属性,例如你的例子中的那个,你不能做1.直接访问底层实例变量,2.做类似的东西

Nsstring *m = [Nsstring stringWithString:@"Hellow,World"];s = [m retain];

为什么?因为第一行根本就没必要 – 真的,为什么 – [Nsstring stringWithString:]?你正在创建一个常量字符串,然后创建它的精确副本 – 它只是多余的.如果Cocoa的设计师是新手,这条线也会浪费内存 – 同一个不可变字符串的两个精确副本.幸运的是,任何实现Nsstring的人都为这种情况做好了准备,并使这个方法检查它的参数是否为常量并返回它而不做任何事情,如果是 – 所以你得到了相同的指针,但是有一些额外的调用objc_msgSend – 这不是你想要的东西.

第二行也是错误的 – 再次,你不按原样使用支持ivar.此外,该属性被声明为保留原因 – 如果您将对象设置为您的属性,该对象将由setter方法保留 – 无需手动保留它.

总而言之,你最好写

self.s = @"Hello World";// ...self.s = nil;

代替.

总结

以上是内存溢出为你收集整理的ios – 将nil分配给保留属性会释放与之关联的对象吗?全部内容,希望文章能够帮你解决ios – 将nil分配给保留属性会释放与之关联的对象吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存