为什么"分配"全局变量应该是自动释放

时间:2012-05-18 01:30:09

标签: iphone objective-c ipad memory-management

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

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

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

4 个答案:

答案 0 :(得分:4)

  

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

不,label是类的属性,包含您发布的代码,由self.label语法证明。它由一个实例变量备份,显式声明或不声明。 label属性的setter负责确保传入的值被适当保留。分配UILabel的代码-viewDidLoad负责释放它,autorelease的调用负责释放它。

  

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

这是不正确的。您永远不会直接致电-dealloc - 当您使用自己创建的对象时,请始终致电-release-autorelease。有关详细信息,请参阅memory management rules

答案 1 :(得分:1)

self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];

UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame];
self.label = temp;
[temp release];
就适当的内存管理而言,

基本相同。只需在不同时间清理内存即可。

我认为该标签的属性类似@property(nonatomic,retain),因此标签继续存在,因为当您致电self.label时,该标签会保留该标签。

答案 2 :(得分:0)

自动释放将您的变量推送到未来版本的池列表中:

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

然后你不需要打电话

[self.label release];

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

[pool release];

将成功发布。

这是用于泄漏裙边

答案 3 :(得分:0)

Self.label是一个属性。

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

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

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