可以使用以下类别在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方法集的一部分一样.很棒,很有用.
您可以添加到类中的类别数量没有限制,但每个类别名称必须不同,并且每个类别都应声明并定义一组不同的方法.
如果你有这样的事情怎么办:
@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.
| 归档时间: |
|
| 查看次数: |
2789 次 |
| 最近记录: |