NIB、setValue:forKey 和保留 (iOS)

发布于 2024-09-12 15:09:37 字数 649 浏览 4 评论 0原文

我知道加载NIB时插座连接的一些机制,但我不确定。所以我问一些问题来确保我的知识。我假设这些都是真的,但是在参考文档中很难找到关于这些的提及。请指出错误和正确的事情。

我有一个像这样定义的 IBOutlet:(当然这不是推荐的方式)

@implementation
{
    IBOutlet id var1;
}
@end
  1. NIB loader (alloc | keep) &自动释放所有顶级对象。因此它将在运行循环结束时释放,而不需要额外的保留。
  2. 连接 IBOutlet 是通过 KVC 完成的。
  3. KVC 主要使用访问器方法。
  4. KVC 其次使用 setValue:forKey。 IBOutlet 将由此方法处理,因为没有声明的属性或访问方法。
  5. setValue:forKey 保留新的值对象。
  6. setValue:forKey 释放旧的值对象。
  7. 因此连接到 IBOutlet 的顶级对象将被保留一次。所以我必须将其释放以进行释放。这就是为什么我必须在 dealloc 方法上释放连接到 IBOutlet 的对象的原因。
  8. 如果该对象连接了另一个IBOutlet(如IBOutlet),则应再次释放该对象以进行dealloc。

I know some mechanism of outlet connection when loading NIB, but I am not sure. So I'm asking some questions to ensure my knowledge. I assumed these things all true, but It's hard to find mention about these on reference documentation. Please point wrong and right things.

I have an IBOutlet defined like this: (Of course it's not recommended way)

@implementation
{
    IBOutlet id var1;
}
@end
  1. NIB loader (alloc | retain) & autorelease all top-level objects. So it will be dealloc on runloop turn ends without additional retain.
  2. Connecting IBOutlets are done with KVC.
  3. KVC uses accessor method primarily.
  4. KVC uses setValue:forKey secondarily. And the IBOutlet will be handled by this method because there's no declared property or access method.
  5. setValue:forKey retains the new value object.
  6. setValue:forKey releases the old value object.
  7. So top-level object connected to the IBOutlet will be retained once. So I have to release it to dealloc. This is why I must release objects connected to IBOutlet on dealloc method.
  8. If the object connected another IBOutlet like the IBOutlet, it should be released once more to be dealloc.

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文