我知道iOS中的内存管理很难受到像我这样的新手的影响,但我希望在stackoverflow上有一个清晰的解释,这是我在其他地方找不到的。
所以,假装我有一个属性/ ivar
@property(nonatomic, retain) UIPopoverController *popOver;
我正在这样分配:
self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];
现在,在我的dealloc和viewDidUnload方法中,我做了两个
// in viewDidUnload:
self.popOver = nil;
// in dealloc:
[popOver release];
问题:
提前感谢您的时间 - 我会继续阅读,认真记忆管理不能那么难以包围......
答案 0 :(得分:5)
1如果我在viewDidUnload / dealloc中执行nil / release,我真的需要在分配时自动释放吗?
是
2反之亦然,如果我在分配时进行自动释放,我是否需要稍后/发布?
是
在第一种情况下,代表该方法完成自动释放。该方法不再需要弹出窗口,因此需要(自动)释放它。
在dealloc
,您的对象不再需要弹出框。因此,您需要将其发布。
这很简单。您不必考虑长期对象所有权;你只需要在每个方法的层面上进行本地思考。是否释放它的决定完全取决于该对象是否由程序的其他部分保留。在一个方法中,如果你分配一个对象而你不再需要在那个方法中,你(自动)释放它。
dealloc
是规则的一个小例外。在那里,您需要释放所有实例变量的所有权。
就是这样!
答案 1 :(得分:5)
不要被这行中的自动释放混淆:
self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];
在此声明之后,您实际拥有了对象,因为属性设置器声明了对象的所有权。自动释放平衡alloc-init
。
所以......是的,你需要在分配时自动发布。如果你这样做(没有自动释放),你会泄漏:
self.popOver = [[UIPopoverController alloc] initWithContentViewController:popOverContent];
另一种选择是使用临时变量而不是autorelease
:
UIPopoverController *temp = [[UIPopoverController alloc] initWithContentViewController:popOverContent];
self.popOver = temp;
[temp release];
无论哪种方式,您都需要在dealloc
中释放对象。
答案 2 :(得分:1)
viewDidUnload
,在视图控制器被销毁时调用dealloc
。在viewDidUnload
中,您释放了视图使用的不再需要的对象,并且可以在viewDidLoad
中重新创建。很明显,由于视图没有显示,因此不需要保留视图控制器为其设置的对象。
在dealloc
中,您正在清理 viewController ,并在此处清除所有资源,包括已分配给视图的资源。
在这种情况下,视图不拥有弹出控制器 - 它应该由视图控制器拥有,因此不需要在viewDidUnload
中释放它,但您需要在{dealloc
中释放它1}}。