gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:35:47 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com