pil*_*lle 7 objective-c autorelease dealloc ios
我知道iOS中的内存管理很容易受到像我这样的新手的影响,但我希望在stackoverflow上有一个清晰的解释,这是我在其他地方找不到的.
所以,假装我有一个房产/ ivar
@property(nonatomic, retain) UIPopoverController *popOver;
Run Code Online (Sandbox Code Playgroud)
我正在分配这样的:
self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];
Run Code Online (Sandbox Code Playgroud)
现在,在我的dealloc和viewDidUnload方法中,我做了两个
// in viewDidUnload:
self.popOver = nil;
// in dealloc:
[popOver release];
Run Code Online (Sandbox Code Playgroud)
题:
提前感谢您的时间 - 我会继续阅读,认真记忆管理不能那么难以包围...
1如果我在viewDidUnload / dealloc中执行nil / release,我真的需要在分配时自动释放吗?
是。
2反之亦然,如果我在分配时自动释放,是否需要在以后取消/释放?
是。
在第一种情况下,代表该方法完成自动释放。该方法不再需要弹出窗口,因此需要(自动)释放它。
在dealloc,您的对象不再需要弹出框。因此,您需要释放它。
非常简单 您不必考虑长期的对象所有权;您只需要在每种方法的层次上非常本地化地思考。是否释放它的决定完全不取决于该对象是否由程序的其他部分保留。在一个方法中,如果您分配了一个对象,而在该方法中不再需要它,则(自动)释放它。
这dealloc是该规则的轻微例外。在那里,您需要释放所有实例变量的所有权。
而已!
不要被这行中的自动释放混淆:
self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];
Run Code Online (Sandbox Code Playgroud)
在此声明之后,您实际拥有该对象,因为属性设置器声明了它的所有权.自动释放平衡了alloc-init.
所以......是的,你需要在分配时自动发布.如果你这样做(没有自动释放),你会泄漏:
self.popOver = [[UIPopoverController alloc] initWithContentViewController:popOverContent];
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用临时变量而不是autorelease:
UIPopoverController *temp = [[UIPopoverController alloc] initWithContentViewController:popOverContent];
self.popOver = temp;
[temp release];
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,您都需要释放对象dealloc.