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

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

  1. 使用类扩展

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

    @implementation HelloViewController
    {
        int value;
    }
    

哪个更好?

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

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

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

【问题讨论】:

标签: objective-c


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多