2012-01-18 106 views
2

我有一个MBProgressHUD我分配如下:removeFromSuperview和释放内存管理

self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease]; 

如果我叫removeFromSuperview那么我将不得不再次呼吁释放progressHUD?另外,如果我声明属性像这样的东西:

NSString * title_; 

@property (nonatomic, retain) NSString * title_; 

则可以保证在我的dealloc我应该对所有权的权利释放?

回答

0

不,您不必再次释放它。当您调用removeFromSuperview时,视图将保留其子视图并自动再次释放它们。只要视图在附加到视图时已被自动释放,它将在从视图中移除时被释放。

我不太明白你的第二个问题,但是,你必须在dealloc语句中释放“retain”或“copy”类型的任何属性。您必须手动编写这些发布声明,它们不会自动添加(除非您正在使用ARC,我强烈建议)。

+0

嗯,基本上,如果我定义了保留在我的.h属性,那我就必须释放在我的dealloc,这是我的问题 – adit 2012-01-19 00:21:03

+0

那是正确的。 – 2012-01-19 00:57:38

+1

你最好用self.title_ = nil;在你的dealloc而不是[title_ release]中,因为这减轻了title_先前发布但尚未设置为零的可能性,从而让你释放一个悬挂指针。 – paiego 2012-01-31 22:04:05

0

你的progressHUD_属性是如何定义的? (顺便说一句,伊娃应该有一个尾部下划线,但不是属性名称)。

在情况下,它被定义为(retain, whatever),你不得不再次释放:

  1. 当你创建它,它retainCount是+1。
  2. 当您将其分配给您的财产时,其retainCount将增加1。
  3. 将其作为子视图添加到父视图时,其retainCount将增加1。
  4. 在某些时候,autorelease最终会减少1,但视图和属性仍然保持。

因此,您必须将您的财产设置为零,或者在您的dealloc方法中对伊娃调用release

此外,在定义NSString属性时,您可能想使用copy而不是retain。是的:你必须以任何方式释放它。

+0

它被定义为@property(nonatomic,retain)progressHUD_; – adit 2012-01-19 00:21:26

+0

是的,你必须再次释放它。另外,你可能想在你的h文件“progressHUD”中调用你的属性,然后在你的m文件中说'@synthesize progressHUD = progressHUD_;':这种方式属性被称为'progressHUD'和ivar'progressHUD_'。 – 2012-01-19 00:35:22

+0

或者我必须使用self才能访问该产权? – adit 2012-01-19 01:00:28

1

如果progressHUD_是retain属性,那么您将不得不在dealloc中释放它。然而,关于保留属性的好处是,您只需将其设置为即可回收内存;确保使用“自我”。之前。

e.g. 

self.<property_name> = nil; 

// or in your case 

self.progressHUD_ = nil; 

// the following will not release it because it's not accessing the property: 

progressHUD_ = nil 

我不推荐使用[progressHUD_ release],因为它可能会导致问题。例如如果在其他地方发布了progressHUD_并且没有将其设置为nil,则可能会意外释放不再分配的指针(悬挂指针)。

我还建议在viewDidUnload中调用self.progressHUD_ = nil;,这是在低内存条件下调用并且未显示视图。它不会杀死你的类实例,而只是卸载视图。和当然前提是你调用viewDidLoadself.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease];而非init...