zan*_*ona 12 objective-c interface-builder iboutlet ios
抱歉,如果我对这个问题过于挑剔,但我现在正在学习iOS编程,而且我似乎有些人声明IBOutlet这样:
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface CustomTableViewController : UITableViewController {
CustomCell *customCell;
}
@property (nonatomic, retain) IBOutlet CustomCell *customCell;
@end
Run Code Online (Sandbox Code Playgroud)
有些人这样声明:
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface CustomTableViewController : UITableViewController {
IBOutlet CustomCell *customCell;
}
@property (nonatomic, retain) CustomCell *customCell;
@end
Run Code Online (Sandbox Code Playgroud)
哪一个是宣告它的正确方法?它们之间有什么区别吗?如果有人知道解释为什么他们把它放在不同的地方,那将是很棒的学习.
非常感谢 :)
Jon*_*nah 12
这两个仍然"在界面内",所以你的标题有点令人困惑,但我看到你在问什么.
在许多情况下,任何一种方法的结果都是相同的,但它们是不同的.IBOutlet属性将调用属性的setter方法,如果设置该属性应该有一些副作用,则可以覆盖该setter.
我更喜欢在属性上使用outlet,因为我认为它使得从笔尖加载的对象的内存管理更加清晰.看一下nib对象的内存管理,我想你会明白我的意思.
创建nib文件中的对象,保留计数为1,然后自动释放.在重建对象层次结构时,UIKit使用setValue:forKey:重新建立对象之间的连接,它使用可用的setter方法,或者如果没有setter方法可用,则默认保留对象.这意味着(假设您遵循"奥特莱斯"中显示的模式)您拥有插座的任何对象仍然有效.但是,如果有任何顶级对象未存储在出口中,则必须保留loadNibNamed:owner:options:方法返回的数组或数组内的对象,以防止这些对象过早释放.
IBOutlet ivars将为这些ivars调用setter(如果它们存在)并且如果没有找到setter则直接保留从nib加载的对象.
将属性作为IBOutlet进行广告至少清楚地表明将始终使用属性的setter并遵循为该属性设置的任何内存管理规则.
最后,我认为IBOutlets是类的公共接口的一部分,因此最好公开方法(通过属性)以便使用它们而不是使用-setValue:forKey:来操作支持ivars,这应该是一个实现细节.
| 归档时间: |
|
| 查看次数: |
5046 次 |
| 最近记录: |