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 с помощью указанного выше метода.