2014-02-16 2 views
0

Существует класс альфа, который имеет метод - (void) doSomething. Существует также бета-версия класса, которую я создал и могу изменить по мере необходимости. Экземпляр альфы может быть создан только путем вызова [gamma createAlpha].Как переопределить метод

Мне нужно, чтобы класс beta наследовал альфу и переопределял doSomething, пока мне еще нужно создавать экземпляры alpha через вызов [gamma createAlpha].

Есть ли способ реализовать это?

Надеюсь, мой вопрос имеет смысл. Спасибо!

+0

Вы пробовали сделать свой гамма-класс ребенком класса альфа? – Ares

+0

@Ares Нет, потому что альфа и гамма являются классами фреймворка/lib, которые я не могу изменить. Любые другие идеи? – RaDo

+0

@RaDo: тогда как вы создаете альфа-объект в гамме? – preetam

ответ

0

Да. Вы можете использовать метод swizzling. Вам необходимо будет создать категорию со следующим кодом:

@implementation alpha (newDoSomething) 

// This is called when the category is being added 
+ (void) load { 
    Method method1 = class_getInstanceMethod(self, @selector(doSomething)); 
    Method method2 = class_getInstanceMethod(self, @selector(swizzleddoSomething)); 

    // this is what switches the two methods 
    method_exchangeImplementations(method1, method2); 
} 

- (void)swizzleddoSomething 
{ 
... your code 
//You can call super implementation here with following line 
//[self swizzleddoSomething]; 
} 

@end 

У вас все еще будет класс альфа. Он будет успешно создан [gamma createAlpha], но будет реализован метод doSomething.

+0

Выглядит интересно, но слегка взломать .. или нет? Используя этот подход, мой метод будет выполняться, если alpha's doSomething будет называться делегатом из другого класса? – RaDo

+0

Да, будет. Это не взлом, это функция времени выполнения Objective C. Но его следует использовать осторожно. Вы можете прочитать об этом здесь. Https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/method_exchangeImplementations – Avt

+0

Отправка приложения в магазин который выполняет метод swizzling, приведет к отклонению указанного приложения. Просто FYI. –

Смежные вопросы