Если я переопределю метод класса, могу ли я вызвать исходный метод (тот, который был переопределен)? - PullRequest
2 голосов
/ 15 августа 2010

В Objective-C, если я переопределяю метод класса, используя категорию, есть ли способ вызвать исходный метод (тот, который был переопределен)?

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

Я представляю вам три странных способа сделать это в +(void)load. В любом случае, назовите свой метод MyCategory_method или около того.

  • class_getMethodImplementation () и class_replaceMethod (). Сохраните старый IMP и позвоните ему напрямую. Вам необходимо получить кодировку типа метода. Обратите внимание, что вы можете просто использовать обычную функцию C тоже ...
  • class_getInstanceMethod (), method_getImplementation (), method_setImplementation (). Как и выше, но вам не нужно получать кодировку типа метода.
  • class_getInstanceMethod () для обоих методов, а затем method_exchangeImplementations (). Вызовите MyCategory_method, чтобы получить оригинальную реализацию. Это самый простой способ сделать это.

Иногда это единственный достаточно простой способ заставить его делать то, что вы хотите ...

РЕДАКТИРОВАТЬ: И делать это, только если вы знаете, что вы делаете!

3 голосов
/ 15 августа 2010

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html

Не похоже, что это возможно.

Когда категория переопределяет унаследованный метод, метод в категории может, как обычно, вызывать унаследованную реализацию через сообщение super.Однако если категория переопределяет метод, который уже существовал в классе категории, нет способа вызвать исходную реализацию.

Это говорит мне о том, что если вы переопределяете метод в подклассе через категорию, вы можете вызвать [super methodName], как обычно, но если вы переопределите метод базового класса напрямую, вы можетене ссылаться на оригинал.

0 голосов
/ 15 августа 2010

Если вы динамически предоставляете переопределение категории (см. ResolInstanceMethod :), вы можете заранее кэшировать предыдущий селектор метода и вызывать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...