【问题标题】:Prefixing private methods and properties为私有方法和属性添加前缀
【发布时间】:2012-05-07 16:26:39
【问题描述】:

我使用类扩展来定义私有方法:

@interface DFPObfuscator ()

+ (NSData *)PS_transform:(CCOperation)encryptOrDecrypt data:(NSData *)data;

@end

Apple 建议使用 PS_ 之类的前缀:

...如果你想 绝对确保您的私有方法的名称不同于 超类中的那些,您可以将自己的前缀添加到您的私有 方法。前缀应尽可能唯一,可能基于一个 在您的公司或项目上,形式为XX_。所以如果你的项目 称为Byte Flogger,前缀可能是BF_addObject:

但是私有财产呢?我应该在它们前面加上PS_ 还是不成问题?

一个例子是:

@interface MTTController ()

@property (strong, nonatomic) Class modelClass;
@property (strong, nonatomic) Class viewClass;

@end

如果超类中有一个私有属性modelClass,会不会有问题?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    一般来说,子类化不需要这个建议。如果 Apple 创建了一个不带下划线前缀的私有方法,那么这是他们框架中的一个错误。

    好吧,我在这里开玩笑了......这是他们框架中的一个错误,您应该针对它打开雷达,但他们一直都在这样做。也就是说,这种为私有方法添加前缀的建议在实践中实际上并不适用。

    首先,方法是否“私有”并不重要。在 ObjC 中没有私有方法之类的东西。只有一些方法没有在头文件中声明。如果您声明一个与 Apple 的私有方法之一冲突的公共方法,您将遇到与您的方法是私有方法相同的问题。 Apple 不应该在没有前导下划线的子类中拥有私有方法。试图避免他们这样做的情况会导致过早的精神错乱。在大多数情况下,这不值得担心。

    但是! (总有一个but)有一种情况你可能应该担心,那就是类别。如果Apple在NSMutableArray上定义了一个类别方法pop,而你也在NSMutableArray上定义了pop,那么运行哪个版本是未定义的。 (我给出这个特殊的例子是因为它发生在我身上。)所以,如果你的类别方法有可能的名称,你应该在它们上加上一个前缀,以保护它们免受 Apple 做同样的事情。正如我之前所说,Apple 不应该在没有前导下划线的情况下创建私有类别方法,但它们确实如此,因此您的类别可能需要担心这一点。类别也是您最有可能添加“常用”名称(如“pop”)的地方。因此,它更有可能是一个问题。

    这里有很多话题。简短的版本是:

    • 一般来说,您不需要为方法添加前缀。
    • 您可能确实希望为名称非常明显的类别方法添加前缀。

    请注意,类扩展不是类别。它们是@interface 的扩展,所以通常你也不应该在其中添加前缀。如果您正在合成属性,并且 Apple 具有相同的私有属性,您应该会收到编译错误。所以大多数时候属性不应该是一个问题,至少对于被设计为子类的类。

    我希望有一个“这样做,你永远不会有问题”,但以上几乎是真正的答案。

    【讨论】:

    • 男人!非常感谢您冗长而清晰的回答。这正是我想知道的。现在要删除我的前缀。 :)
    【解决方案2】:

    完全没问题;)

    但你能做的是:

    @synthesize myVariable 时在 MTTController.m 中;只需这样做:

    @synthesize myVariable = _myVariable;
    

    _ 通常代表类的属性。
    或者您可以在 .h 中直接将其命名为 _myVariable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2013-08-16
      • 2020-09-05
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多