1

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

@interface DFPObfuscator ()

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

@end

PS_Apple 推荐使用 like 前缀:

...如果您想绝对确定您的私有方法的名称与超类中的名称不同,您可以将您自己的前缀添加到您的私有方法中。前缀应尽可能唯一,可能基于您的公司或项目,格式为XX_. 因此,如果您的项目名为 Byte Flogger,则前缀可能是BF_addObject:.

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

一个例子是:

@interface MTTController ()

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

@end

如果超类中有私有财产modelClass,会有问题吗?

4

2 回答 2

1

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

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

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

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

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

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

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

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

于 2012-05-07T19:49:19.413 回答
0

一点问题都没有;)

但是你可以做的是:

当您 @synthesize myVariable 时,在您的 MTTController.m 中;只是这样做:

@synthesize myVariable = _myVariable;

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

于 2012-05-07T19:31:57.933 回答