removeFromSuperview并释放内存管理

时间:2012-01-18 23:53:53

标签: iphone objective-c ios ipad

我有一个MBProgressHUD,我分配如下:

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

如果我调用removeFromSuperview,那么我是否必须再次调用progressHUD版本?如果我用这样的东西声明一个属性:

NSString * title_;

@property (nonatomic, retain) NSString * title_;

然后保证在我的dealloc中我应该有一个标题发布权吗?

3 个答案:

答案 0 :(得分:1)

如果progressHUD_是一个retain属性,那么你必须在dealloc中释放它。但是,关于retain属性的好处是你只需要将它设置为 nil 来回收内存;确保使用“自我”。之前。

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,你可能会意外地释放一个不再分配的指针(悬空指针)。

我还建议在self.progressHUD_ = nil;中调用viewDidUnload,这是在内存不足的情况下调用的,并且视图没有显示。它不会杀死您的类实例,只是卸载视图。当然,这假设您在self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease];而不是viewDidLoad

中致电init...

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

如果它被定义为(retain, whatever),您 将不得不再次发布它:

  1. 创建时,其retainCount为+1。
  2. 当您将其分配给您的财产时,其retainCount将增加一个。
  3. 当您将其作为子视图添加到父视图时,其retainCount将增加一个。
  4. 在某些时候,自动释放最终将减少1,但视图和属性仍然保持不变。
  5. 因此,您必须在dealloc方法中将属性设置为nil或在ivar上调用release

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