在@interface之内或之外声明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 

哪一个是正确的方法来申报呢? 他们之间有什么区别? 如果有人知道解释为什么他们把它放在不同的地方,这将是非常好的学习。

非常感谢 :)

这两个仍然是“内部界面”,所以你的标题有点混乱,但我明白你在问什么。

在许多情况下,任何一种方法的结果都是一样的,但它们是不同的。 一个IBOutlet属性将调用该属性的setter方法,如果设置该属性应该有一些副作用,那么给你一个覆盖该setter的机会。

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

创buildnib文件中的对象的保留计数为1,然后自动释放。 在重build对象层次结构时,如果没有setter方法可用,UIKit使用setValue:forKey:重新build立对象之间的连接,该对象使用可用的setter方法或默认保留该对象。 这意味着(假设您按照“sockets”中显示的模式)任何您有sockets的物体仍然有效。 但是,如果存在任何不存储在sockets中的顶级对象,则必须保留由loadNibNamed:owner:options:方法返回的数组或数组中的对象,以防止这些对象被过早释放。

IBOutlet ivars将会调用这些ivars的setter(如果存在的话),如果没有findsetter,则直接保留从nib加载的对象。

作为IBOutlet广告的财产至less明确表示,该物业的二传手将永远使用,并遵循任何内存pipe理规定已经为该财产。

最后,我认为IBOutlets是类的公共接口的一部分,因此更好地暴露方法(通过属性)与他们一起工作,比使用-setValue:forKey:来操作应该是实现细节的支持ivars 。

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

但是,这两种款式都有一条冗余线。 简单的说出伊娃的声明。 只是线路

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

在现代运行时中已经足够了。

如果你有一个复杂的项目,我build议将所有的sockets从公共接口移动到一个单独的头文件中。 大多数sockets都是专用接口,将它们放在标题中的唯一原因是Interface Builder可以find它们。

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

但是,这是事情:

如果你需要你的class级有一些特殊的行为,或者必须从外面访问等等,而且必须是一个财产,那么我会说你有两个select可供select(附属于财产和内部类接口)。

如果这不是你的情况,不要创build一个属性,没有必要,只需在你的类接口中进行。

希望能帮助到你 ;)