我可以使用类类别来覆盖已使用类别实现的方法吗?像这样:
1)原始方法
-(BOOL) method {
return true;
}
Run Code Online (Sandbox Code Playgroud)
2)覆盖方法
-(BOOL) method {
NSLog(@"error?");
return true;
}
Run Code Online (Sandbox Code Playgroud)
这会起作用,还是非法的?
使用类别时,您可以使用自己的方式覆盖实现方法,如下所示:
// Base Class
@interface ClassA : NSObject
- (NSString *) myMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
@end
//Category
@interface ClassA (CategoryB)
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end
Run Code Online (Sandbox Code Playgroud)
在包含类别之后调用方法"myMethod"将结果"B".
myMethod的Category实现调用原始Class A myMethod的最简单方法是什么?尽管我可以理解,你必须使用低级调用来获取A类的原始方法钩子并调用它,但似乎在语法上更容易实现这一点.
以下是在目标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
Run Code Online (Sandbox Code Playgroud)
问题是,如果我只是导入ClassA.h并发送消息
[myClassA myMethod]; //returns B
Run Code Online (Sandbox Code Playgroud)
这为什么会回归B?我没有导入ClassA + CategoryB
即便如此,如果我做了以下事情:
// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject
- (NSString *) myMethod;
- (NSString *) …Run Code Online (Sandbox Code Playgroud) 我知道有关Objective-C类别的一些规则:
- 类别方法不应覆盖现有方法(类或实例)
- 对同一个类实现相同方法的两个不同类别将导致未定义的行为
我想知道当我覆盖同一类别中我自己的一个类别方法时会发生什么.例如:
@interface NSView (MyExtensions)
- (void)foo; // NSView category implementation
@end
@interface MyClass : NSView
{ }
@end
@interface MyClass (MyExtensions)
- (void)foo; // MyClass category implementation
@end
Run Code Online (Sandbox Code Playgroud)
定义了这些接口后,当我运行以下代码时将执行哪个方法?
MyClass * instance = [[MyClass alloc] initWith...];
[instance foo];
[instance release];
Run Code Online (Sandbox Code Playgroud)
注意:使用我的编译器,MyClass实现优先,但我不确定是否可以保证发生,或者只是一种特定的未定义行为.
我想使用类NSArray + Populate.h扩展一个类:
@interface NSArray (Populate)
-(NSArray *) populateArray;
@end
Run Code Online (Sandbox Code Playgroud)
如果有另一个类别(来自另一个模块或库),使用具有相同名称的方法扩展NSArray,如何检测情况?
例如,如果有NSArray + Fill.h:
@interface NSArray (Fill)
-(NSArray *) populateArray;
@end
Run Code Online (Sandbox Code Playgroud)
据我了解,运行时引擎会默默地选择其中一个版本,而不会发生任何崩溃?