我知道使用类别覆盖方法是一种令人沮丧的做法。尽管如此,我必须处理一些这样做的代码。当我运行下面的代码时,我最初感到惊讶的是,在两种情况下都调用了类别方法,但考虑链接器必须在链接时如何为任何给定符号做出决定,这让我感觉更好。在类别中重写的方法是否总是优先于原始实现?
我的问题:假设除了我创建的其他类别不在其他类别中,我保证在我的类别中的实现始终是被调用的逻辑,只要它的标头从某处导入?
someObject.h
#import <Foundation/Foundation.h>
@interface SomeObject : NSObject
- (void)doSomething;
@end
someObject.m
#import "SomeObject.h"
@implementation SomeObject
- (void)doSomething
{
NSLog(@"Original");
}
@end
someObject + Cat.h
#import <Foundation/Foundation.h>
#import "SomeObject.h"
@interface SomeObject (SomeObject)
- (void)doSomething;
@end
someObject + Cat.m
#import "SomeObject+Cat.h"
@implementation SomeObject (SomeObject)
- (void)doSomething
{
NSLog(@"New!");
}
@end
someObjectUser.h
#import <Foundation/Foundation.h>
@interface SomeObjectUser : NSObject
- (void)useSomeObject;
@end
someObjectUser.m
#import "SomeObjectUser.h"
#import "SomeObject.h"
@implementation SomeObjectUser
- (void)useSomeObject
{
[[SomeObject new] doSomething];
}
@end
Test.m
- (void)testExample
{
[[SomeObject new] doSomething];
[[SomeObjectUser new] useSomeObject];
}
结果
2013-02-28 11:32:37.417 CategoryExample[933:907] New!
2013-02-28 11:32:37.419 CategoryExample[933:907] New!
@NikolaiRuhe我不同意,这些问题是根本不同的。 – 2013-02-28 16:58:42
@MikeD问题有点不同,但答案对于这两个问题都是有效的。 – Sulthan 2013-02-28 17:00:58
我确实已经先读过这个问题,现在可以看到那里有答案,但是指南说未定义的行为“不太可能是一个问题”,这让我想知道这里是否有更多的见解。 。 – 2013-02-28 17:28:50