Учебники

Objective-C Позирует

Прежде чем начать с позирования в Objective-C, я хотел бы обратить ваше внимание на то, что позирование было объявлено устаревшим в Mac OS X 10.5 и после этого оно не будет доступно для использования. Так что для тех, кто не обеспокоен этими устаревшими методами, можете пропустить эту главу.

Objective-C позволяет классу полностью заменить другой класс в программе. Говорят, что замещающий класс «представляет собой» целевой класс. Для версий, которые поддерживали позирование, все сообщения, отправленные целевому классу, вместо этого принимаются классом позирования.

NSObject содержит poseAsClass — метод, который позволяет нам заменить существующий класс, как сказано выше.

Ограничения в позе

  • Класс может представлять собой только один из своих прямых или косвенных суперклассов.

  • Класс позирования не должен определять какие-либо новые переменные экземпляра, которые отсутствуют в целевом классе (хотя он может определять или переопределять методы).

  • Целевой класс, возможно, не получил никаких сообщений до постановки.

  • Класс представления может вызывать переопределенные методы через super, включая реализацию целевого класса.

  • Класс позирования может переопределять методы, определенные в категориях.

Класс может представлять собой только один из своих прямых или косвенных суперклассов.

Класс позирования не должен определять какие-либо новые переменные экземпляра, которые отсутствуют в целевом классе (хотя он может определять или переопределять методы).

Целевой класс, возможно, не получил никаких сообщений до постановки.

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

Класс позирования может переопределять методы, определенные в категориях.

#import <Foundation/Foundation.h>

@interface MyString : NSString

@end

@implementation MyString

- (NSString *)stringByReplacingOccurrencesOfString🙁NSString *)target
withString🙁NSString *)replacement {
   NSLog(@"The Target string is %@",target);
   NSLog(@"The Replacement string is %@",replacement);
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   [MyString poseAsClass:[NSString class]];
   NSString *string = @"Test";
   [string stringByReplacingOccurrencesOfString:@"a" withString:@"c"];
   
   [pool drain];
   return 0;
}

Теперь, когда мы скомпилируем и запустим программу в более старой Mac OS X (V_10.5 или более ранней), мы получим следующий результат.

2013-09-22 21:23:46.829 Posing[372:303] The Target string is a
2013-09-22 21:23:46.830 Posing[372:303] The Replacement string is c

В приведенном выше примере мы просто загрязнили исходный метод нашей реализацией, и это повлияет на все операции NSString с помощью вышеуказанного метода.