自动释放与dealloc中的释放

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. 反之亦然,如果我在分配时进行自动释放,我是否需要在以后使用nil/release?
  3. 有什么区别,如果有的话?

提前感谢您的时间 - 我会继续阅读,认真记忆管理不能那么难以包围...

Yuj*_*uji 5

1如果我在viewDidUnload / dealloc中执行nil / release,我真的需要在分配时自动释放吗?

是。

2反之亦然,如果我在分配时自动释放,是否需要在以后取消/释放?

是。

在第一种情况下,代表该方法完成自动释放。该方法不再需要弹出窗口,因此需要(自动)释放它。

dealloc,您的对象不再需要弹出框。因此,您需要释放它。

非常简单 您不必考虑长期的对象所有权;您只需要在每种方法的层次上非常本地化地思考。是否释放它的决定完全不取决于该对象是否由程序的其他部分保留。在一个方法中,如果您分配了一个对象,而在该方法中不再需要它,则(自动)释放它。

dealloc是该规则的轻微例外。在那里,您需要释放所有实例变量的所有权。

而已!


alb*_*amg 5

不要被这行中的自动释放混淆:

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.