我仍然对这个有点困惑。什么时候释放对象是正确的时间?
我在Xcode程序创建对象,比方说一个UILabel,这也将是一个类范围内的属性。
当是适当的时候释放该对象,在其被创建,或在像正常IBOutlet中对象dealloc方法的方法?
谢谢。
我仍然对这个有点困惑。什么时候释放对象是正确的时间?
我在Xcode程序创建对象,比方说一个UILabel,这也将是一个类范围内的属性。
当是适当的时候释放该对象,在其被创建,或在像正常IBOutlet中对象dealloc方法的方法?
谢谢。
这取决于你的财产是否设置保留值与否。通常,当属性设置为新值时,您希望访问器(由@synthesize生成)处理保留/释放。您可以指定这样的属性是这样的:
MyController.h
@interface MyController : UIViewController {
UILabel *myLabel;
}
@property (nonatomic, retain) UILabel *myLabel;
@end
然后可以使用@synthesize生成默认的getter和setter。 'retain'属性的默认设置将释放当前值并保留新值。然而,在dealloc中没有为你做任何事情。意思是,当控制器被销毁时,你的标签引用将会泄漏,因为释放不会被调用。出于这个原因,你需要调用release在dealloc中所有的“保留”的属性,就像这样:
MyController.m
@implementation MyController
@synthesize myLabel;
-(void) dealloc {
self.myLabel = nil;
[super dealloc];
}
@end
请注意,在这种情况下,self.myLabel =零,几乎相当于调用[myLabel发布],因为setter将调用现有值的释放,然后在新值上调用retain。由于新值为零,调用[nil retain]不起作用。我宁愿不用释放,因为你也将伊娃尔设置为零,并避免悬挂指针。
当你创建一个这样的属性通过从Interface Builder的反对,你不需要有IBOutlet中,以纪念它。在使用IB创建控件的情况下,应该在viewDidUnload中删除所有IBOutlet引用。这是因为如果未保留,则可以将您的控件与视图一起解除分配。引用它之后会崩溃的应用程序,所以这是一个很好的做法,他们为零,这样的:
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.myIBLabel = nil;
}
出现这种情况使用属性时是省略了“自我”的一部分另一个常见的错误。如果您不使用self.myIBLabel符号,则您正在双向吸气和吸气器,并直接使用伊娃。这不会保留/释放对象。
+1非常会写很多很好的小细节。欢迎来到SO。 – 2011-01-29 20:37:19
你应该释放它的dealloc方法,虽然这取决于你如何建立你的类属性。
如果你在创建它的方法中释放它,然后在你的类的其他部分使用它(这是因为你让UILabel成为一个类属性,我假设你是),你当您稍后尝试对其进行修改时会遇到不好的访问。请注意,如果您使用的是保留的财产,你需要考虑到这一点,在这种情况下,你可能会释放标签(因为你已经创造了它,并将其分配给您的类属性,这将再次保留它)。
下面是一个典型的例子:
- (void) someMethod {
UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
self.textLabel = myLabel;
[myLabel release];
}
- (void) dealloc {
[textLabel release];
}
虽然,如果您从未分配过对象(并且使用了返回自动释放对象的静态工厂方法),那么您绝对不应该释放它。 –
非常真实!我只展示了一种做法。你也可以做一些事情,比如self.textLabel = [[[UILabel alloc] initWithFrame:myFrame] autorelease],否定了上面所做的所有事情。这是有几种不同方法的情况之一,最好挑选一个并坚持下去。在这种情况下,Apple的内存管理文档是最全面的参考资料,在可能的情况下依靠这种方法要好得多。 – lxt
什么时候它长大了,你知道你教过它知道你知道的重要部分,而现实世界会教它剩下的。打开门,让物体自由飞翔。 –
不完全有帮助,但很幽默。谢谢。 – thenameisnick
我生命的故事。 –