当我创建一个我想要分配给属性的变量时,我可以执行以下操作(假设属性为@property (nonatomic,retain) UILabel *myLabel;
):
UILabel *temp = [[UILabel alloc] init];
self.myLabel = temp;
[temp release];
在以下不使用temp
的情况下会发生什么?
self.myLabel = [[UILabel alloc] init];
[myLabel release];
假设由于属性我会在[myLabel release];
中添加dealloc
。
这是适当的内存管理吗?在第二个示例中,myLabel
行后init
的保留计数为2?
答案 0 :(得分:5)
第二种可能会起作用,但是不正确。第一行调用setMyLabel:
。这可能恰好设置了一个ivar,它可能没有。它可能会做各种事情(它可能会复制,它可能会将信息存储在其他地方等)。您的第二行发布ivar
。如果setter碰巧按照你假设的方式实现,那么你会很幸运,它会起作用。但这不是正确的内存管理。
第一个例子是正确的。您还可以使用自动释放池来简化操作。更好的方法是将代码移动到ARC,这样可以更快,更轻松地解决所有这些问题。
答案 1 :(得分:-1)
分配给retain
属性将自动在分配给的对象上调用retain
(并在前一个对象上调用release
)。
self.myLabel = [[UILabel alloc] init];
[myLabel retainCount]
将返回2,一个来自init
,另一个来自分配属性。因此,您应该在上面的行中添加autorelease
,或者在函数退出之前调用release
。