在@interface内部或外部声明IBOutlet?

时间:2011-01-08 17:34:53

标签: objective-c ios interface-builder iboutlet

抱歉,如果我对这个问题过于挑剔,但我现在正在学习iOS编程,而且我似乎有些人宣称IBOutlet是这样的:

IBOutlet附属于财产

#import <UIKit/UIKit.h>
#import "CustomCell.h"

@interface CustomTableViewController : UITableViewController {
  CustomCell *customCell;
}
@property (nonatomic, retain) IBOutlet CustomCell *customCell;
@end

有些人这样宣称:

IBOutlet附加到接口

内的声明
#import <UIKit/UIKit.h>
#import "CustomCell.h"

@interface CustomTableViewController : UITableViewController {
  IBOutlet CustomCell *customCell;
}
@property (nonatomic, retain) CustomCell *customCell;
@end

哪一个是宣告它的正确方法?它们之间有什么区别吗? 如果有人知道解释他们为什么把它放在不同的地方,那么学习它会很棒。

非常感谢:)

3 个答案:

答案 0 :(得分:12)

这两个仍然“在界面内”所以你的标题有点令人困惑,但我看到你在问什么。

在许多情况下,任何一种方法的结果都是相同的,但它们是不同的。 IBOutlet属性将调用属性的setter方法,如果设置该属性应该有一些副作用,则可以覆盖该setter。

我更喜欢在属性上使用outlet,因为我认为它使得从笔尖加载的对象的内存管理更加清晰。看看memory management of nib objects,我想你会明白我的意思。

  

nib文件中的对象创建时保留计数为1,然后自动释放。在重建对象层次结构时,UIKit使用setValue:forKey:重新建立对象之间的连接,它使用可用的setter方法,或者如果没有setter方法可用,则默认保留对象。这意味着(假设您遵循“奥特莱斯”中显示的模式)您拥有插座的任何对象仍然有效。但是,如果有任何顶级对象没有存储在出口中,则必须保留loadNibNamed:owner:options:方法返回的数组或数组中的对象,以防止这些对象过早释放。

IBOutlet ivars会调用这些ivars的setter(如果它们存在),并且如果没有找到setter则直接保留从nib加载的对象。

将属性作为IBOutlet广告,至少清楚地表明将始终使用属性的setter并遵循为该属性设置的任何内存管理规则。

最后,我认为IBOutlets是类的公共接口的一部分,因此最好公开方法(通过属性)来使用它们比使用-setValue更渴望:forKey:操作应该是的后备ivars一个实现细节。

答案 1 :(得分:1)

这两种样式是可以互换的,生成的代码或从笔尖加载对象的方式没有区别。真。

但是,这两种样式都有冗余线。简单地省略ivar声明。只是一行

@property (nonatomic, retain) IBOutlet CustomCell *customCell;

在现代运行时就足够了。

如果您有一个复杂的项目,我建议将所有出口从公共界面移到一个单独的头文件中。大多数出口都是私有接口,将它们放在标题中的唯一原因是Interface Builder可以找到它们。

答案 2 :(得分:0)

你可以两种方式申报,实际上没有区别。

但是,事情就是这样:

如果你需要你的班级有一些特殊行为的ivar或者必须从外面访问等等,并且它必须是一个属性,那么我会说你有2个选项可供选择(附在属性和类接口内部。)

如果不是这种情况,不要创建属性,不必在类接口中进行。

希望它有所帮助;)