我正在运行 XCode 4.6.3 并尝试创建一个具有冲突类别方法的项目,如下所示。
//NSString+category1.h
@interface NSString (category1)
-(NSString*)foo;
@end
//NSString+category1.m
#import "NSString+category1.h"
@implementation NSString (category1)
-(NSString*)foo{
return self;
}
@end
// NSString+category2.h
@interface NSString (category2)
-(NSString*)foo;
@end
//NSString+category2.m
#import "NSString+category2.h"
@implementation NSString (category2)
-(NSString*)foo{
return self;
}
@end
XCode 4.6 应该给我一些警告,但事实并非如此。是否需要设置特殊的编译器/链接器标志?
根据使用 Objective-C 编程指南中的避免类别方法名称冲突:
如果类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至超类)上的另一个类别中的方法相同,则使用哪个方法实现的行为是未定义的在运行时。 ...
...为了避免未定义的行为,最好的做法是为框架类的类别中的方法名称添加前缀,就像您应该为自己的类的名称添加前缀一样。您可以选择使用与类前缀相同的三个字母,但小写以遵循方法名称的通常约定,然后在方法名称的其余部分之前使用下划线。
底线,我相信开发人员有责任确保方法名称是唯一的。