4

当我创建要分配给属性的变量时,我可以执行以下操作(假设属性为@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后是否保留计数为 2 init

4

2 回答 2

5

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

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

于 2012-05-21T16:02:35.713 回答
-1

分配给retain属性将自动调用retain分配给的对象(并调用release前一个对象)。所以是的,之后

self.myLabel = [[UILabel alloc] init];

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

于 2012-05-21T16:01:59.210 回答