2011-01-29 91 views
1

我仍然对这个有点困惑。什么时候释放对象是正确的时间?

我在Xcode程序创建对象,比方说一个UILabel,这也将是一个类范围内的属性。

当是适当的时候释放该对象,在其被创建,或在像正常IBOutlet中对象dealloc方法的方法?

谢谢。

+2

什么时候它长大了,你知道你教过它知道你知道的重要部分,而现实世界会教它剩下的。打开门,让物体自由飞翔。 –

+0

不完全有帮助,但很幽默。谢谢。 – thenameisnick

+0

我生命的故事。 –

回答

3

这取决于你的财产是否设置保留值与否。通常,当属性设置为新值时,您希望访问器(由@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符号,则您正在双向吸气和吸气器,并直接使用伊娃。这不会保留/释放对象。

+0

+1非常会写很多很好的小细节。欢迎来到SO。 – 2011-01-29 20:37:19

2

你应该释放它的dealloc方法,虽然这取决于你如何建立你的类属性。

如果你在创建它的方法中释放它,然后在你的类的其他部分使用它(这是因为你让UILabel成为一个类属性,我假设你是),你当您稍后尝试对其进行修改时会遇到不好的访问。请注意,如果您使用的是保留的财产,你需要考虑到这一点,在这种情况下,你可能会释​​放标签(因为你已经创造了它,并将其分配给您的类属性,这将再次保留它)。

下面是一个典型的例子:

- (void) someMethod { 
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame]; 

    self.textLabel = myLabel; 
    [myLabel release]; 
} 


- (void) dealloc { 
    [textLabel release]; 
} 
+0

虽然,如果您从未分配过对象(并且使用了返回自动释放对象的静态工厂方法),那么您绝对不应该释放它。 –

+1

非常真实!我只展示了一种做法。你也可以做一些事情,比如self.textLabel = [[[UILabel alloc] initWithFrame:myFrame] autorelease],否定了上面所做的所有事情。这是有几种不同方法的情况之一,最好挑选一个并坚持下去。在这种情况下,Apple的内存管理文档是最全面的参考资料,在可能的情况下依靠这种方法要好得多。 – lxt

相关问题