objective-c - 给私有(private)方法和属性添加前缀

标签 objective-c cocoa

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

@interface DFPObfuscator ()

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

@end

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

... if you want to be absolutely sure that your private methods have names different from those in the superclass, you can add your own prefix to your private methods. The prefix should be as unique as possible, perhaps one based on your company or project and of the form XX_. So if your project is called Byte Flogger, the prefix might be BF_addObject:.

但是私有(private)属性(property)呢?我应该在它们前面加上 PS_ 前缀还是没有问题?

一个例子是:

@interface MTTController ()

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

@end

如果父类(super class)中有一个私有(private)属性modelClass,会出现问题吗?

最佳答案

通常,您不需要此建议来进行子类化。如果 Apple 创建一个不带下划线前缀的私有(private)方法,那么这是他们框架中的一个错误。

好吧,我在这里开个玩笑......这是他们框架中的一个错误,你应该针对它打开雷达,但他们一直这样做。也就是说,这种为私有(private)方法添加前缀的建议在实践中并没有真正发挥作用。

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

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

这里有很多讨论。简短的版本是:

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

请注意,类扩展不是类别。它们是 @interface 的扩展,因此通常您也不应该在此处添加前缀。如果您正在综合属性,并且 Apple 具有相同的私有(private)属性,则您应该会收到编译错误。因此,大多数时候属性不应该成为问题,至少对于设计为子类化的类来说是这样。

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

关于objective-c - 给私有(private)方法和属性添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10485623/

相关文章:

ios - 将 dbmanager 数据填充到 UITableView

objective-c - 哪个更容易使用? GCD 还是 NSOperation?

ios - Xcode 8 本地化导入崩溃

objective-c - 公共(public)元素和属性(property)的使用

xcode - 有没有办法使用 NSSavePanel 保存 "."文件而不需要 MacOS 警告我?

objective-c - 如何显示 MPMoviePlayerController 控件?

ios - 在 UIWebView 中加载本地存储的图像

ios - MKMapView 在放大时更改引脚

objective-c - 你能用位域从 C 结构创建 NSValue 吗?

objective-c - 是否可以继承 NSSavePanel 子类?