一个简单的内存管理问题如下:
-(void)viewDidLoad
{
......
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
......
}
我认为label是一个全局变量,根据管理协议,如果你用“alloc”创建一个实例,你应该只是“dealloc”它,为什么要在这里“autorelease”?
一个简单的内存管理问题如下:
-(void)viewDidLoad
{
......
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
......
}
我认为label是一个全局变量,根据管理协议,如果你用“alloc”创建一个实例,你应该只是“dealloc”它,为什么要在这里“autorelease”?
我认为标签是一个全局变量......
不,label
是包含您发布的代码的类的属性,如self.label
语法所示。它由一个实例变量支持,无论是否显式声明。属性的设置器label
负责确保传入的值被适当地保留。分配 UILabel 的代码-viewDidLoad
负责释放它,调用会执行此autorelease
操作。
...根据管理协议,如果您使用“alloc”创建一个实例,您应该只是“dealloc”它...
这是不正确的。您永远不会-dealloc
直接调用 - 总是调用-release
或-autorelease
在使用完您创建的对象时调用。有关详细信息,请参阅内存管理规则。
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
相对
UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame];
self.label = temp;
[temp release];
就正确的内存管理而言,它们本质上是相同的。内存将被正确清理,只是在不同的时间。
我会假设该标签的属性类似于@property(nonatomic,retain)
因此标签继续存在,因为它在您调用时由属性保留self.label
。
Self.label 是一个属性。
UILabel *tempLabel = [[UILabel alloc] initWithFrame:labelFrame] -> 保留计数为 1
self.label = tempLabel -> 现在保留计数为 2
但是你只使用 self.label,所以如果你不使用 autorelease 或释放你创建的标签,你会遇到内存泄漏问题;)
autorelease 正在将您的变量推送到池列表中以供将来发布:
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// your code
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
// your code
[pool release];
然后你不需要打电话
[self.label release];
因为变量是自动释放的。在代码行中
[pool release];
将成功发布。
这是用于漏水踢脚线