IBOutlet 成员变量是否自动保留?
奇怪的发现,当我使用拖放来创建一个新的 IBOutlet 时,如下所示,根本没有使用 @property:
@interface SkinChoosingView : UIViewController {
IBOutlet UIActivityIndicatorView * activityIndicator;
}
Xcode 插入了 -release
并将outlet 设置为 nil in viewDidUnload。我查看了 viewDidLoad,但没有
-retain
在那里!这违背了我所知道的关于内存管理的一切。
我想苹果肯定对这些东西略知一二,那么幕后是否有什么事情发生呢?我从来没有从这些类型的 IBOutlet 中泄漏过,也从未发布过它们。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,它会在加载 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
assign
ed property.And since it retains the outlet for you, you must release in
viewDidUnload
as the outlets will be reloaded by the time nextviewDidLoad
is called.答案是它使用“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).