我有一个MBProgressHUD,我分配如下:
self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease];
如果我调用removeFromSuperview,那么我是否必须再次调用progressHUD版本?如果我用这样的东西声明一个属性:
NSString * title_;
@property (nonatomic, retain) NSString * title_;
然后保证在我的dealloc中我应该有一个标题发布权吗?
答案 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)
,您 将不得不再次发布它:
因此,您必须在dealloc方法中将属性设置为nil或在ivar上调用release
。
此外,在定义NSString属性时,您可能希望使用copy
而不是retain
。是的:你必须以任何一种方式释放它。