gpt4 book ai didi

objective-c - autorelease 与 dealloc 中的 release

转载 作者:可可西里 更新时间:2023-11-01 03:28:57 27 4
gpt4 key购买 nike

我知道 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. 有什么区别,如果有的话?

提前感谢您抽出时间 - 我会继续阅读,说真的,内存管理并不难让您全神贯注...

最佳答案

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

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 中释放对象。

关于objective-c - autorelease 与 dealloc 中的 release,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7293307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com