一个简单的内存管理问题如下:
-(void)viewDidLoad
{
......
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
......
}
我认为label是一个全局变量,根据管理协议,如果你用“alloc”创建一个实例,你应该“dealloc”它,为什么“autorelease”在这里?
答案 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,所以如果你不使用自动释放或释放你创建的标签,你将会遇到内存泄漏问题;)