我对内存释放 IBOutlet 对象感到两难。有没有人建议当我们创建没有属性的 IBOutlet 对象时该怎么办,需要释放它吗?如果需要发布...我们为什么要发布它
8 回答
答案是肯定的。
运行时将对象连接到IBOutlet
using [setValue:ForKey:]
。此函数将找到私有实例变量,保留目标并将其设置为实例变量。请访问此处iOS 开发人员库以了解更多信息。
我强烈建议您阅读这篇文章,因为许多 iOS 框架通过键值合规([setValue:ForKey:]
或[valueForKey:]
)访问属性,而不是直接调用 getters/setters/instance 变量。
IBOutlet
不会改变属性的所有权语义。如果您不使用 ARC,则必须像使用任何其他属性一样释放保留的对象。
只需将其设置为默认值,即“弱”。那么你对ARC没问题。
为什么不只拥有一个私有 IBOutlet 属性,以使事情更清晰、更明确。我总是亲自这样做:
MyClassName.m
@interface MyClassName ()
@property (nonatomic, weak) IBOutlet NSObject *myPropertyNameForAnOutlet;
@end
@implementation MyClassName
...
@end
答案是YES...
我也对此感到困惑,但试试这个:
打开一个xib文件
onen 助手编辑器窗口并在您的 XIB IB 文件附近获取 .h 文件代码
在 IB 文件中选择了一个对象(一个没有引用任何 var 的对象)
ctrl 点击它并选择:“新参考插座”按钮
将该行拖到您的 .h 代码文件的 @interface{ } 部分
为您的新变量命名(“aaa”)
(请注意,没有创建属性“aaa”)
现在 Xcode 已经为你完成了所有的魔法,并且......
在 .m 文件中,您可以在 dealloc 方法中找到:
- (void) dealloc {
[aaa release];
[super dealloc];
}
所以......如果苹果发布它,似乎通过XIB文件加载的默认IBOutlet vars被保留......
编辑:
这是苹果文档中的重点:
您不是该对象的所有者。所以不需要释放 IBOutlet 对象。如果您在 IBoutlet 对象上使用@property(非原子,保留),那么您必须在 dealloc 中释放该对象。
看看Advanced Memory Management Programming Guide
你不能放弃你不拥有的对象的所有权
您不是对象的所有者,因此您不释放它。
您通过保留、复制或创建(init/alloc)对象成为所有者。只有这样,您才是对象的(其中一个)所有者,并且在您使用完对象后需要释放它。更多信息检查 Cocoa 核心能力 - 内存管理
我希望这可以解释为什么您不必释放该对象。
即使您没有将其设置为属性,该属性也是指 setter 和 getter 方法。当你使用一个对象时,你应该永远记得释放它。该属性与内存问题无关。