在 Objective-C 中定义私有变量的最佳方法

Posted

技术标签:

【中文标题】在 Objective-C 中定义私有变量的最佳方法【英文标题】:Best way to define private variables in Objective-C 【发布时间】:2012-11-12 01:00:04 【问题描述】:

我想在 MyClass.m 文件中定义私有实例变量。在我看来有两种方法可以做到:

    使用类扩展

    @interface HelloViewController ()
    
         int value;
    
    

    在@implementation 部分定义

    @implementation HelloViewController
    
        int value;
    
    

哪个更好?

我认为最近Apple的编码风格是使用类扩展?

例如MasterViewController.m 由 'Master-Detail Application Template' 生成

@interface MasterViewController () 
    NSMutableArray *_objects;

@end

【问题讨论】:

为什么需要私有实例变量而不是私有属性? 当然是在@implementation - 少打字! How to declare instance variables and methods not visible or usable outside of the class instance?的可能重复 @PeterM 在实现中这样做意味着您不能将属性设置为读写/只读、原子/非原子和强/复制。看不出有多好。 【参考方案1】:
@interface HelloViewController ()

    @private     //optional, this is old style
    int vale;

但是,如果您正在创建一个库,理论上没有人会知道您没有在头文件中声明的任何方法。

复制自:How to make a real private instance variable?


在@implementation 中声明实例变量是最近的 Obj-C 的特性,这就是为什么你在 @interface - 没有其他选择。

如果您使用的编译器支持声明实例 实现中的变量声明它们可能是 最佳默认值 - 仅在需要时将它们放在界面中 被其他人访问。

在实现中声明的实例变量是隐式的 隐藏(实际上是私有的)并且无法更改可见性 - @public、@protected 和 @private 不会产生编译器错误(带有 至少当前的 Clang)但被忽略。

复制自:Private ivar in @interface or @implementation

【讨论】:

请在你的答案中添加一些推理。 谢谢。妥妥的投了赞成票。总结一下:这主要是个人喜好问题。【参考方案2】:

“现代 Objective-C”的方法是在你的实现块中声明它们,如下所示:

@implementation ClassName 
    int privateInteger;
    MyObject *privateObject;


// method implementations etc...

@end

更多详情请参阅我之前的this帖子。

【讨论】:

我在 Apple 文档中找不到任何建议这是更好的方法的地方。 在实现中做,缺点是不能指定非原子、副本等属性属性。 @Boon 这并不取决于你在哪里声明它,而是它是一个普通的 ivar 还是一个属性。 对不起,不清楚,是的,这就是我的意思。做 ivar 的缺点是你不能指定 strong/copy 等。所以你必须记住在数组上调用 copy。 99% 的 Apple 示例代码使用属性而不是 ivar。【参考方案3】:

在我看来,最好的方法是将其定义为私有属性,您可以在实现中将其作为字段或属性访问,优点是您可以通过 self 以及 _fieldName 语法访问它们,这在某些情况下很方便.

@interface SignUpController ()
@property ViewHeaderView*header; //private properties/fields
@property UITextField*activeField;
@property CGFloat keyboardHeight;
@end

@implementation SignUpController 



@end

【讨论】:

以上是关于在 Objective-C 中定义私有变量的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

第8章 继承(Objective-C程序设计)

是否可以在 Objective-C 中将方法声明为私有?

无法访问扩展 Objective-C 类的 Swift 类中的私有变量

是否可以在 Objective-C 中创建私有属性?

将受保护的 Objective-C 实例变量公开给子类

第二次过程性考核