@interface MyViewController : UIViewController {
UITextField *textField;
}
@property (nonatomic, retain) UITextField *textField;
UITextField *aTextField = [[UITextField alloc] init];
self.textField = aTextField;
[aTextField release]; 我不知道为什么aTextField是必要的。我不能这样写吗?
@property (nonatomic, assign) UITextField *textField;
self.textField = [[UITextField alloc] init]; 发布于 2011-08-09 03:21:40
@property (nonatomic, assign) UITextField *textField;
self.textField = [[UITextField alloc] init];来自@bbum答案的评论:
我没有保留的
。我做了财产保险。赋值后保留计数为1。我只需要在dealloc中释放一次。
不要这样做!
好的,如果在两者之间没有发生任何事情,就不会泄漏(属性是assign!)但这违背了对象所有权的基本原理。
标记为assign的属性用于您不拥有委托的对象,例如。因此,根据内存管理规则:您不能放弃您不拥有的对象的所有权。
这样做,你会遇到很多麻烦,因为你依赖于实现细节,你知道你创建了对象,你需要释放它。你不会想把自己放在那个位置的。如果您稍后设置了另一个对象呢?您可能会泄露前者,并可能过度释放后者,从而导致潜在的崩溃。
发布于 2011-08-09 02:03:52
澄清:将保留和释放视为增量;对于每个隐含保留的语句,您必须有一个平衡释放。保留是一个“保持这个对象存活,直到平衡释放”的语句。
差不多;你需要(假设是@property(retain) UITextField *textField;):
textField = [[UITextField alloc] init]; // +1 retain或者:
self.textField = [[[UITextField alloc] init] autorelease]; // +1, +1, -1 (delayed)唯一不同的是,上面的赋值是直接赋值的,不使用setter来保留对象。
如果您要执行以下操作:
self.textField = [[UITextField alloc] init]; // +1 +1你会泄漏对象的。
是的,在所有正确的情况下,您需要:
self.textField = nil;或者:
[textField release];在你的dealloc里。
哦,对不起,我错过了第二个@property声明中的assign。
简而言之,不要这么做。它是一个弱引用,很容易变得摇摆不定。它有它的用法,不幸的是,它们比正常情况下更常见(最常见的是对象图中的银行指针,尽管委托也使用它们)。我上面写的仍然有效;考虑保留为增量,在assign的情况下,没有+1,也没有要平衡的东西。
但是,在这种情况下,assign也很可能是不正确的;您应该使用retain。您可以使用assign并在外部管理保留/释放,但这既不典型,也非常脆弱。属性上的retain专门用来表示所有权!
https://stackoverflow.com/questions/6986429
复制相似问题