除非需要,否则我喜欢不公开类变量。在我看到的大多数 Objective-C 代码中,变量被声明为属性,即使它们永远不会被外部人员使用。
@interface DetailViewController : UIViewController {
__weak IBOutlet UILabel *name;
}
对比
@interface DetailViewController : UIViewController
@property (weak, nonatomic) UILabel *name;
作为一名软件工程专业的学生,我认为这严重违反了封装等原则,并可能导致大型项目中出现不必要的耦合。
我确实了解使用属性的 KVC 方面,但不明白为什么要公开显然只在类内部使用的变量,例如上面的 UILabel。
有人可以解释为什么在 iOS 上使用 Objective-C 时这是首选方式吗?
最佳答案
属性封装了 iVar 的内存管理(例如分配、保留、复制、强、弱),而直接访问 iVar(实例变量)则没有。这大大减少了内存错误。
非公共(public)属性可以在 .m
的顶部声明,因此没有理由将它们放在 header 中:
@interface DetailViewController ()
@property (weak, nonatomic) NSString *name;
@end
属性确实创建可以访问的ivar。对于上面的示例,对于显式合成的属性,ivar 将被命名为 name
,而隐式合成的合成属性将具有前导下划线 _name
。
IBOutlet
在 header 中声明,即使其他类不需要访问它们,因为它们是必需的,以便 Interface Builder 连接到它们并且 nib 加载系统可以填充导出。 IBOutlet
通常是 View ,例如您的 UILabel
。
编辑:
关于 IBOulet
的上一段是 Xcode 3 及更早版本所需的遗留方法。但是,由于 InterfaceBuilder 与 IDE 的其余部分更紧密地集成,较新版本的 Xcode 可以使用实现文件中定义的 socket ,就像上面的属性一样。
关于ios - 属性 vs 实例变量,类封装性差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458782/