Objective-C позирует

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

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

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

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

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

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

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

  • Позирующий класс может вызывать переопределенные методы через 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 с помощью указанного выше метода.