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

37

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

  1. 使用类扩展

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

  4. @implementation HelloViewController
    {
        int value;
    }
    

哪个更好?

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

例如 'Master-Detail Application Template' 生成的 MasterViewController.m 文件。

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

1
为什么需要私有实例变量而不是私有属性? - Anurag
在实现中 - 减少打字! - Peter M
可能是重复的问题:如何声明仅在类实例内部不可见或不可用的实例变量和方法?(https://dev59.com/22025IYBdhLWcg3wvIm2) - Max MacLeod
@PeterM 在实现中这样做意味着您无法设置属性为readwrite/readonly、atomic/nonatomic和strong/copy。我不明白这有什么好处。 - Boon
3个回答

58
"现代 Objective-C" 的做法是在实现代码块中声明它们,就像这样:"
@implementation ClassName {
    int privateInteger;
    MyObject *privateObject;
}

// method implementations etc...

@end

请参阅我早期发布的这篇帖子,其中包含更多细节。


我无法在Apple文档中找到任何推荐这种方法的地方。 - Boon
在实现中这样做的缺点是你无法指定属性特性,如nonatomic、copy等。 - Boon
@Boon 这并不取决于你在哪里声明它,而是取决于它是一个普通的实例变量还是一个属性。 - DrummerB
抱歉表述不够清晰,是的那就是我的意思。使用 ivar 的劣势在于您无法指定 strong/copy 等等。因此您必须记得在数组上调用 copy。99% 的 Apple 示例代码使用 property 而不是 ivar。 - Boon

8
@interface HelloViewController ()
{
    @private     //optional, this is old style
    int vale;
}

如果你正在制作一个库,理论上没有在头文件中声明的方法是不为人知的。
来源:如何创建真正的私有实例变量?
在Obj-C中,在@implementation中声明实例变量是一个最近的特性,这就是为什么你会看到很多代码将它们放在@interface中 - 没有其他选择。
如果您正在使用支持在实现中声明实例变量的编译器,则将它们声明在那里可能是最好的默认选项 - 只有在需要被其他人访问时才将它们放在接口中。
在实现中声明的实例变量是隐式隐藏的(有效地是私有的),可见性不能更改 - @public、@protected和@private不会产生编译器错误(至少在当前的Clang中),但会被忽略。
来源:在@interface或@implementation中的私有ivar

请在您的答案中添加一些推理。 - fzwo
谢谢。已经点赞了。总的来说:这主要是个人口味问题。 - fzwo

0
在我看来,最好的方法是将其定义为私有属性,您可以在实现中作为字段或属性访问它们,优点是您可以通过self以及_fieldName语法访问它们,在某些情况下非常方便。
@interface SignUpController ()
@property ViewHeaderView*header; //private properties/fields
@property UITextField*activeField;
@property CGFloat keyboardHeight;
@end

@implementation SignUpController {

}

@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接