需要发布IBOutlet对象吗?

时间:2012-10-22 07:44:21

标签: iphone objective-c ios memory-management

我对内存释放IBOutlet对象感到困惑。当我们创建没有属性的IBOutlet对象时,有什么人建议做什么,需要释放它?如果需要释放......为什么我们要释放它

8 个答案:

答案 0 :(得分:4)

答案是肯定的。

运行时使用IBOutlet将对象连接到[setValue:ForKey:]。此函数将查找私有实例变量,保留目标并将其设置为实例变量。请访问此处iOS Developer Library了解更多信息。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只需将其设置为默认值,即“弱”。那你对ARC很好。

答案 3 :(得分:1)

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

MyClassName.m

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

@implementation MyClassName 
...
@end

答案 4 :(得分:1)

答案是肯定的......

我也对此感到困惑,但试试这个:

打开xib文件

onen assistant editor window并获取您的XIB IB文件附近的.h文件代码

在IB文件中选择了一个对象(一个没有引用任何var的对象)

按住ctrl键并选择:“新参考插座”按钮

将该行拖到@interface {}部分

中的.h代码文件中

给你的新var(“aaa”)

命名

(请注意,没有创建属性“aaa”)

现在Xcode已经为你完成了所有的魔力,并且......

你可以在dealloc方法中找到.m文件中的

- (void) dealloc {   
    [aaa release];
    [super dealloc];
}

所以...如果苹果发布它,似乎保留了通过XIB文件加载的默认IBOutlet变量...

修改

这是point in apple doc

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

您不是该对象的所有者,因此您不会将其释放。

您通过保留,复制或创建(初始化/分配)对象成为所有者。只有这样你才能成为对象的所有者之一,并且在完成对象时需要释放它。更多信息检查 Cocoa core competencies - Memory Management

我希望这能解释为什么你不必释放这个对象。

答案 7 :(得分:-1)

即使您没有将其设置为属性,该属性也会引用setter和getter方法。当您使用对象时,您应该始终记得释放它。该属性与内存问题无关。