IBOutlet 成员变量是否自动保留?

发布于 2024-11-17 10:54:34 字数 425 浏览 0 评论 0 原文

奇怪的发现,当我使用拖放来创建一个新的 IBOutlet 时,如下所示,根本没有使用 @property:

@interface SkinChoosingView : UIViewController {
    IBOutlet UIActivityIndicatorView * activityIndicator;
}

Xcode 插入了 -release 并将outlet 设置为 nil in viewDidUnload。我查看了 viewDidLoad,但没有 -retain 在那里!这违背了我所知道的关于内存管理的一切。

我想苹果肯定对这些东西略知一二,那么幕后是否有什么事情发生呢?我从来没有从这些类型的 IBOutlet 中泄漏过,也从未发布过它们。

Weird discovery, when I used a drag and drop to make a new IBOutlet, as shown below, not with a @property at all:

@interface SkinChoosingView : UIViewController {
    IBOutlet UIActivityIndicatorView * activityIndicator;
}

Xcode inserted a -release and set the outlet to nil in viewDidUnload. I looked in viewDidLoad though, and no -retain was there! This went against everything I know about memory management.

I figure apple must know a thing or two about this stuff though, so is there something behind the scenes happening here? I have never had leaks from these types of IBOutlets, and I've never released them.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浪漫人生路 2024-11-24 10:54:34

是的,它会在加载 NIB 文件时自动为您保留插座,除非您将与插座关联的属性显式声明为分配属性。

由于它为您保留了插座,因此您必须在 viewDidUnload 中释放,因为在下次调用 viewDidLoad 时将重新加载插座。

Yes, it automatically retains the outlet for you when loading the NIB file unless you explicitly declare the property associated with the outlet as an assigned property.

And since it retains the outlet for you, you must release in viewDidUnload as the outlets will be reloaded by the time next viewDidLoad is called.

与风相奔跑 2024-11-24 10:54:34

答案是它使用“Key-Value Coading”,这意味着它调用 -setValue:forKey:,它有一个 “默认搜索模式”。对于 ivars,它会执行类似 [ivar autorelease] 的操作; ivar = [保留新值];

“当前最佳实践”是将 IBOutlet 放在属性上而不是 ivars (请参阅 此处)。这使得所使用的内存管理模式一目了然,并且更能适应拼写错误(例如,如果您拼错了 ivar)。

The answer is that it uses "Key-Value Coading", which means it calls -setValue:forKey:, which has a "Default Search Pattern". For ivars, it does something like [ivar autorelease]; ivar = [newvalue retain];.

The "current best practice" is to stick IBOutlet on properties instead of ivars (see here). This makes it obvious what memory management pattern is being used and is more resilient to typos (e.g. if you misspell the ivar).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文