0

一个简单的内存管理问题如下:

-(void)viewDidLoad
{
    ......
    self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
    ......
}

我认为label是一个全局变量,根据管理协议,如果你用“alloc”创建一个实例,你应该只是“dealloc”它,为什么要在这里“autorelease”?

4

4 回答 4

4

我认为标签是一个全局变量......

不,label是包含您发布的代码的类的属性,如self.label语法所示。它由一个实例变量支持,无论是否显式声明。属性的设置器label负责确保传入的值被适当地保留。分配 UILabel 的代码-viewDidLoad负责释放它,调用会执行此autorelease操作。

...根据管理协议,如果您使用“alloc”创建一个实例,您应该只是“dealloc”它...

这是不正确的。您永远不会-dealloc直接调用 - 总是调用-release-autorelease在使用完您创建的对象时调用。有关详细信息,请参阅内存管理规则

于 2012-05-18T02:08:32.737 回答
1
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];

相对

UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame];
self.label = temp;
[temp release];

就正确的内存管理而言,它们本质上是相同的。内存将被正确清理,只是在不同的时间。

我会假设该标签的属性类似于@property(nonatomic,retain)因此标签继续存在,因为它在您调用时由属性保留self.label

于 2012-05-18T01:36:33.510 回答
0

Self.label 是一个属性。

UILabel *tempLabel = [[UILabel alloc] initWithFrame:labelFrame] -> 保留计数为 1

self.label = tempLabel -> 现在保留计数为 2

但是你只使用 self.label,所以如果你不使用 autorelease 或释放你创建的标签,你会遇到内存泄漏问题;)

于 2012-05-18T03:22:48.850 回答
0

autorelease 正在将您的变量推送到池列表中以供将来发布:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// your code
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
// your code
[pool release];

然后你不需要打电话

[self.label release];

因为变量是自动释放的。在代码行中

[pool release];

将成功发布。

这是用于漏水踢脚线

于 2012-05-18T01:48:54.727 回答