自动释放与dealloc中的释放

时间:2011-09-03 13:13:26

标签: objective-c ios autorelease dealloc

我知道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];

问题:

  1. 如果我在viewDidUnload / dealloc中执行nil / release,我真的需要在分配时自动释放吗?
  2. 反之亦然,如果我在分配时进行自动释放,我是否需要稍后/发布?
  3. 有什么区别,如果有的话?
  4. 提前感谢您的时间 - 我会继续阅读,认真记忆管理不能那么难以包围......

3 个答案:

答案 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)

  1. 是。但也许不是这种情况。
  2. 是。但也许不是这种情况。
  3. 卸载视图时调用
  4. viewDidUnload,在视图控制器被销毁时调用dealloc
  5. viewDidUnload中,您释放了视图使用的不再需要的对象,并且可以在viewDidLoad中重新创建。很明显,由于视图没有显示,因此不需要保留视图控制器为其设置的对象。

    dealloc中,您正在清理 viewController ,并在此处清除所有资源,包括已分配给视图的资源。

    在这种情况下,视图不拥有弹出控制器 - 它应该由视图控制器拥有,因此不需要在viewDidUnload中释放它,但您需要在{dealloc中释放它1}}。