ios - 属性 vs 实例变量,类封装性差?

标签 ios objective-c

除非需要,否则我喜欢不公开类变量。在我看到的大多数 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/

相关文章:

iphone - 如何在 UIWebView 中设置内容偏移量和内容大小

ios - 如何在后台更新 MPNowPlayingInfoCenter 以及 AVQueuePlayer 中的轨道发生变化

ios - Swift 是 UIImage 类实习

ios - 如何使用 iOS 7 SpriteKit Particle 向不是游戏的 iOS App 添加粒子效果?

ios - UISwitch 滞后

ios - 找不到用于测试的libxml/tree.h文件

ios - 调用 resignFirstResponder 时如何避免 iPad 键盘消失?

objective-c - 在 AVPlayer 中静音 HTTP 实时流

ios - Apple Store 提交失败并出现错误 ITMS-90046,但关联域不在权利中

objective-c - iOS 7 已弃用用于应用内购买的 transactionReceipt。我可以用什么代替它?