4

我对内存释放 IBOutlet 对象感到两难。有没有人建议当我们创建没有属性的 IBOutlet 对象时该怎么办,需要释放它吗?如果需要发布...我们为什么要发布它

4

8 回答 8

4

答案是肯定的。

运行时将对象连接到IBOutletusing [setValue:ForKey:]。此函数将找到私有实例变量,保留目标并将其设置为实例变量。请访问此处iOS 开发人员库以了解更多信息。

我强烈建议您阅读这篇文章,因为许多 iOS 框架通过键值合规([setValue:ForKey:][valueForKey:])访问属性,而不是直接调用 getters/setters/instance 变量。

于 2012-10-22T07:56:01.523 回答
1

IBOutlet不会改变属性的所有权语义。如果您不使用 ARC,则必须像使用任何其他属性一样释放保留的对象。

于 2012-10-22T07:46:39.493 回答
1

只需将其设置为默认值,即“弱”。那么你对ARC没问题。

于 2012-10-22T07:48:54.707 回答
1

为什么不只拥有一个私有 IBOutlet 属性,以使事情更清晰、更明确。我总是亲自这样做:

MyClassName.m

@interface MyClassName ()
@property (nonatomic, weak) IBOutlet NSObject *myPropertyNameForAnOutlet;
@end

@implementation MyClassName 
...
@end
于 2012-10-22T08:04:03.590 回答
1

答案是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被保留......

编辑:

这是苹果文档中的重点

于 2012-10-22T08:22:44.857 回答
1

您不是该对象的所有者。所以不需要释放 IBOutlet 对象。如果您在 IBoutlet 对象上使用@property(非原子,保留),那么您必须在 dealloc 中释放该对象。

看看Advanced Memory Management Programming Guide
你不能放弃你不拥有的对象的所有权

于 2012-10-22T08:34:21.410 回答
0

您不是对象的所有者,因此您不释放它。

您通过保留、复制或创建(init/alloc)对象成为所有者。只有这样,您才是对象的(其中一个)所有者,并且在您使用完对象后需要释放它。更多信息检查 Cocoa 核心能力 - 内存管理

我希望这可以解释为什么您不必释放该对象。

于 2012-10-22T08:38:48.837 回答
-1

即使您没有将其设置为属性,该属性也是指 setter 和 getter 方法。当你使用一个对象时,你应该永远记得释放它。该属性与内存问题无关。

于 2012-10-22T08:13:57.300 回答