gpt4 book ai didi

objective-c - Objective-C 类别名称有什么作用吗?

转载 作者:太空狗 更新时间:2023-10-30 03:16:46 25 4
gpt4 key购买 nike

一个类可以在 Objective C 中使用一个类别来扩展,例如:

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

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

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

}
@end

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

Apple documents regarding Categories ,文档状态:

There’s no limit to the number of categories that you can add to a class, but each category name must be different, and each should declare and define a different set of methods.

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

@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

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

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

类别名称对编译器或链接器有什么意义吗?无论如何,类别名称是方法签名的一部分还是原始 namespace 的一部分?如果类别名称没有意义,你怎么知道你是否要踩到另一个方法并得到未定义的行为?

最佳答案

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

@interface NSString (MyCompanyCategoryName)

- (NSString *)MYCO_fabulousAddition;

@end

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

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

关于objective-c - Objective-C 类别名称有什么作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5689088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com