36

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

  1. 使用类扩展

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

    @implementation HelloViewController
    {
        int value;
    }
    

哪个更好?

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

例如,由“主从应用程序模板”生成的 MasterViewController.m

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

3 回答 3

56

执行此操作的“现代 Objective-C”方法是在您的实现块中声明它们,如下所示:

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

// method implementations etc...

@end

有关更多详细信息,请参阅我之前的这篇文章。

于 2012-11-23T16:46:13.960 回答
8
@interface HelloViewController ()
{
    @private     //optional, this is old style
    int vale;
}

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

复制自:如何制作真正的私有实例变量?


在@implementation 中声明实例变量是Obj-C 的最新功能,这就是为什么您在@interface 中看到很多带有它们的代码的原因——别无选择。

如果您使用的编译器支持在声明它们的实现中声明实例变量,那么可能是最好的默认值 - 只有在需要其他人访问它们时才将它们放在接口中。

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

复制自:@interface 或 @implementation 中的私有 ivar

于 2012-11-23T16:43:26.263 回答
0

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

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

@implementation SignUpController {

}

@end
于 2019-06-10T00:40:56.410 回答