Я понимаю, что переопределение метода с помощью категории - это обескураженная практика. Тем не менее, мне приходится иметь дело с некоторым кодом, который делает это. Когда я запускал следующий код, я был сначала удивлен тем, что мой метод категории был вызван в обоих случаях, хотя думать о том, как линкер должен был принять решение во время ссылки для любого данного символа, заставило меня чувствовать себя лучше.Будет ли метод, переопределяемый в категории, всегда иметь приоритет над исходной реализацией?
Мой вопрос: Предполагая, что в других играх нет других категорий, кроме тех, которые я создаю, я уверен, что реализация в моей категории всегда будет логикой, которая называется до тех пор, пока заголовок для нее импортируется откуда-то?
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 Я не согласен, вопросы принципиально разные. –
@MikeD Вопрос немного другой, но ответ верен для обоих вопросов. – Sulthan
Сначала я прочитал этот вопрос и теперь вижу, как там есть ответ, однако тот факт, что руководство говорит, что неопределенное поведение «менее вероятно, проблема» заставило меня задуматься о том, есть ли дополнительные сведения, которые будут здесь. –