抱歉,如果我对这个问题过于挑剔,但我现在正在学习iOS编程,而且我似乎有些人宣称IBOutlet
是这样的:
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface CustomTableViewController : UITableViewController {
CustomCell *customCell;
}
@property (nonatomic, retain) IBOutlet CustomCell *customCell;
@end
有些人这样宣称:
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface CustomTableViewController : UITableViewController {
IBOutlet CustomCell *customCell;
}
@property (nonatomic, retain) CustomCell *customCell;
@end
哪一个是宣告它的正确方法?它们之间有什么区别吗? 如果有人知道解释他们为什么把它放在不同的地方,那么学习它会很棒。
非常感谢:)
答案 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个选项可供选择(附在属性和类接口内部。)
如果不是这种情况,不要创建属性,不必在类接口中进行。
希望它有所帮助;)