Objective-C类别名称可以做什么吗?

the*_*olf 16 objective-c

可以使用以下类别在Objective C中扩展类:

@interface NSString (CategoryName)
-(NSString *)myFabulousAddition;  // a fabulous additional method
@end

/////////////////////////////
@implementation NSString (CategoryName)

-(NSString *)myFabulousAddition {
    // do something fabulous...

}
@end
Run Code Online (Sandbox Code Playgroud)

在这个小例子中,我将把方法添加myFabulousAddition到NSString中.然后我就可以调用它,[anNSString myFabulousAddition]就像它是NSString方法集的一部分一样.很棒,很有用.

关于类别Apple文档中,文档声明:

您可以添加到类中的类别数量没有限制,但每个类别名称必须不同,并且每个类别都应声明并定义一组不同的方法.

如果你有这样的事情怎么办:

@interface NSString (CategoryName)
-(NSString *)myFabulousAddition;  // a fabulous additional method
@end

@interface NSString (ANOTHERCategoryName)
-(NSString *)myFabulousAddition;  // a DIFFERENT fabulous additional method 
                                  // BUT with same name as the other category
@end


/////////////////////////////

@implementation NSString (CategoryName)

-(NSString *)myFabulousAddition {
    // do something fabulous...

}
@end
@implementation NSString (ANOTHERCategoryName)

-(NSString *)myFabulousAddition {
    // do something equally fabulous, but DIFFERENT...

}
@end
Run Code Online (Sandbox Code Playgroud)

括号中缺少名称表示该表单是类的扩展名,如下所示:

@interface MyObject ()   // No name -- an extension vs category to MyObject
- (void)setNumber:(NSNumber *)newNumber;
@end
Run Code Online (Sandbox Code Playgroud)

类别名称对编译器或链接器有什么意义吗?无论如何,类别名称是方法签名的一部分还是原始命名空间的一部分?如果类别名称没有意义,那么您如何知道是否要踩踏另一种方法并获得未定义的行为?

小智 7

避免踩踏方法的方法是在类别方法名称前加上前缀,如下所示:

@interface NSString (MyCompanyCategoryName)

- (NSString *)MYCO_fabulousAddition;

@end
Run Code Online (Sandbox Code Playgroud)

如果您遇到来自不同类别的方法名称的冲突,那么在运行时哪个"获胜"是完全未定义的.

类别的名称几乎完全没用,除了无名类别(即())是为类扩展保留的.类扩展的方法应该在类的main中实现@implementation.

  • 似乎我唯一的保护是`SomeUniquePrefixForMyCompanyOrMeThatIsUglyFabulousMethod`,这只会增加我可怜的手指上的重复压力综合症......谢谢! (2认同)