首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@property(retain)做什么?

@property(retain)做什么?
EN

Stack Overflow用户
提问于 2011-06-15 23:45:39
回答 2查看 456关注 0票数 0

@propert(retain)做了什么?通过我的测试,它实际上并没有保留我的对象:

代码语言:javascript
复制
id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
propertyWithRetain = obj;
NSLog(@"%d", [obj retainCount]);

// output:
// 1
// 1

如何创建真正保留对象的属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-15 23:47:27

你没有在那里使用你的财产,这就是为什么它没有保留!

试试这个:

代码语言:javascript
复制
id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
self.propertyWithRetain = obj; // Note the self. :)
NSLog(@"%d", [obj retainCount]);

使用self.将使用该属性。仅仅使用变量名是不会的。

特别是为@bbum编辑(他在评论中提出了一个非常公平的观点)

不要依赖于使用retainCount -你不知道你的对象还保留了什么,你也不知道其中的一些保留是否实际上是计划的自动释放,所以它通常是一个误导性的数字:)

票数 5
EN

Stack Overflow用户

发布于 2011-06-15 23:49:18

代码语言:javascript
复制
propertyWithRetain = obj;

这只是将ivar设置为直接支持该属性。合成@属性时,如果没有声明实例变量,则会自动生成一个实例变量。上面的代码直接使用了ivar。

代码语言:javascript
复制
self.propertyWithRetain = obj;

这实际上会通过@synthesized设置器,并增加保留计数。

这也是为什么我们很多人使用@synthesize propertyWithRetain = propertyWithRetain_;来改变iVar的名称。

请注意,即使在这种情况下,调用retainCount也可能会产生严重的误导。尝试使用[NSNumber numberWithInt: 2];或常量字符串。真的,别给retainCount打电话。永远不会。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6360499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档