首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么临时变量在分配时是必需的?

为什么临时变量在分配时是必需的?
EN

Stack Overflow用户
提问于 2011-08-09 02:00:56
回答 2查看 264关注 0票数 0
代码语言:javascript
复制
@interface MyViewController : UIViewController {
    UITextField *textField;
}
@property (nonatomic, retain) UITextField *textField;

UITextField *aTextField = [[UITextField alloc] init];   
self.textField = aTextField;
[aTextField release];   

我不知道为什么aTextField是必要的。我不能这样写吗?

代码语言:javascript
复制
@property (nonatomic, assign) UITextField *textField;

self.textField = [[UITextField alloc] init];    
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-09 03:21:40

代码语言:javascript
复制
@property (nonatomic, assign) UITextField *textField;

self.textField = [[UITextField alloc] init];

来自@bbum答案的评论:

我没有保留的

。我做了财产保险。赋值后保留计数为1。我只需要在dealloc中释放一次。

不要这样做!

好的,如果在两者之间没有发生任何事情,就不会泄漏(属性是assign!)但这违背了对象所有权的基本原理。

标记为assign的属性用于您不拥有委托的对象,例如。因此,根据内存管理规则:您不能放弃您不拥有的对象的所有权。

这样做,你会遇到很多麻烦,因为你依赖于实现细节,你知道你创建了对象,你需要释放它。你不会想把自己放在那个位置的。如果您稍后设置了另一个对象呢?您可能会泄露前者,并可能过度释放后者,从而导致潜在的崩溃。

票数 0
EN

Stack Overflow用户

发布于 2011-08-09 02:03:52

澄清:将保留和释放视为增量;对于每个隐含保留的语句,您必须有一个平衡释放。保留是一个“保持这个对象存活,直到平衡释放”的语句。

差不多;你需要(假设是@property(retain) UITextField *textField;):

代码语言:javascript
复制
 textField = [[UITextField alloc] init]; // +1 retain

或者:

代码语言:javascript
复制
 self.textField = [[[UITextField alloc] init] autorelease]; // +1, +1, -1 (delayed)

唯一不同的是,上面的赋值是直接赋值的,不使用setter来保留对象。

如果您要执行以下操作:

代码语言:javascript
复制
 self.textField = [[UITextField alloc] init]; // +1 +1

你会泄漏对象的。

是的,在所有正确的情况下,您需要:

代码语言:javascript
复制
self.textField = nil;

或者:

代码语言:javascript
复制
[textField release];

在你的dealloc里。

哦,对不起,我错过了第二个@property声明中的assign

简而言之,不要这么做。它是一个弱引用,很容易变得摇摆不定。它有它的用法,不幸的是,它们比正常情况下更常见(最常见的是对象图中的银行指针,尽管委托也使用它们)。我上面写的仍然有效;考虑保留为增量,在assign的情况下,没有+1,也没有要平衡的东西。

但是,在这种情况下,assign也很可能是不正确的;您应该使用retain。您可以使用assign并在外部管理保留/释放,但这既不典型,也非常脆弱。属性上的retain专门用来表示所有权!

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

https://stackoverflow.com/questions/6986429

复制
相关文章

相似问题

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