gpt4 book ai didi

ios - 通过类别覆盖 Objective c 中的方法

转载 作者:IT王子 更新时间:2023-10-29 08:04:42 24 4
gpt4 key购买 nike

以下是在 objective-c 中工作:

// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject
- (NSString *) myMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
@end

//Category in ClassA+CategoryB.h and ClassA+CategoryB.m
@interface ClassA (CategoryB)
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end

问题是,如果我只是导入 ClassA.h 并发送消息

[myClassA myMethod]; //returns B

为什么返回 B?我没有导入 ClassA+CategoryB

更进一步,如果我执行以下操作:

// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject
- (NSString *) myMethod;
- (NSString *) mySecondMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
- (NSString *) mySecondMethod { return [self myMethod]; }
@end

//Category in ClassA+CategoryB.h and ClassA+CategoryB.m
@interface ClassA (CategoryB)
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end

并调用 mySecondMethod:

ClassA *a = [[ClassA alloc] init];
NSLog(@"%@",[a myMethod]);

结果仍然是 B 尽管没有人知道(由于没有导入)类别实现?!

如果我正在导入类别,我会异常(exception),只返回 B...

所以任何提示表示赞赏。

最佳答案

Objective-C 消息传递是动态的,这意味着您是否导入类别并不重要。该对象将接收消息并执行该方法。

类别正在覆盖您的方法。这意味着当运行时向该对象发送消息时,无论您导入什么,总会找到重写的方法。

如果你想忽略一个类别,你不应该编译它,所以你可以从编译器源中删除该类别。
另一种方法是子类化。

另请阅读:

Avoid Category Method Name Clashes

Because the methods declared in a category are added to an existing class, you need to be very careful about method names.

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime. This is less likely to be an issue if you’re using categories with your own classes, but can cause problems when using categories to add methods to standard Cocoa or Cocoa Touch classes.

因此,在您的情况下,您没有遇到任何问题,因为如前所述,用户定义的类不太可能发生这种情况。但是您绝对应该使用子类而不是编写类别

关于ios - 通过类别覆盖 Objective c 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259517/

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