未命名变量的内存管理

时间:2012-05-21 15:56:05

标签: objective-c ios4 memory-management memory-leaks

当我创建一个我想要分配给属性的变量时,我可以执行以下操作(假设属性为@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?

2 个答案:

答案 0 :(得分:5)

第二种可能会起作用,但是不正确。第一行调用setMyLabel:。这可能恰好设置了一个ivar,它可能没有。它可能会做各种事情(它可能会复制,它可能会将信息存储在其他地方等)。您的第二行发布ivar。如果setter碰巧按照你假设的方式实现,那么你会很幸运,它会起作用。但这不是正确的内存管理。

第一个例子是正确的。您还可以使用自动释放池来简化操作。更好的方法是将代码移动到ARC,这样可以更快,更轻松地解决所有这些问题。

答案 1 :(得分:-1)

分配给retain属性将自动在分配给的对象上调用retain(并在前一个对象上调用release)。

后,是的
self.myLabel = [[UILabel alloc] init];

[myLabel retainCount]将返回2,一个来自init,另一个来自分配属性。因此,您应该在上面的行中添加autorelease,或者在函数退出之前调用release