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

时间:2012-11-23 16:35:36

标签: objective-c

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

  1. 使用类扩展

    @interface HelloViewController ()
    {
         int value;
    }
    
  2. 在@implementation部分中定义

    @implementation HelloViewController
    {
        int value;
    }
    
  3. 哪个更好?

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

    e.g。 MasterViewController.m由'Master-Detail Application Template'生成

    @interface MasterViewController () {
        NSMutableArray *_objects;
    }
    @end
    

3 个答案:

答案 0 :(得分:48)

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

@implementation ClassName {
    int privateInteger;
    MyObject *privateObject;
}

// method implementations etc...

@end

请参阅我之前发布的this更多详情。

答案 1 :(得分:8)

@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 :(得分:0)

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

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

@implementation SignUpController {

}

@end