如果两个分类实现了同样的方法,实际调用哪个是未定义的。
比如NSString
的分类NSStringExtensionMethods
实现了- (BOOL)isEqualToString:(NSString *)aString;
。如果我们在自己的分类里面也实现了- (BOOL)isEqualToString:(NSString *)aString;
方法,则实际调用哪个是不确定的。
为了避免这一现象发生,最好的解决方法是为分类内的方法名添加前缀,就好像给自定义的类添加前缀一样。
读者可以选择同自定义一样的三个字母的前缀,但字母要小写,以便遵循方法命名的惯例,然后在前缀和正式的方法名之间添加一个下划线。
@interface NSString (XYZAdditions)
- (BOOL)xyz_isEqualToString:(NSString *)aString;
@end
这样就可以保证方法在运行时能够被正确调用。命名冲突的可能性被消除了:
BOOL isEqual=[@"A string." xyz_isEqualToString:@"B string."];