Amaç-C Poz Verme

Başlamadan önce PosingObjective-C'de, pozlamanın Mac OS X 10.5'te kullanımdan kaldırıldığını ve daha sonra kullanılamayacağını bildirmek isterim. Bu nedenle, bu kullanımdan kaldırılmış yöntemler hakkında endişelenmeyenler için bu bölümü atlayabilirsiniz.

Objective-C, bir sınıfın, bir program içindeki başka bir sınıfı tamamen değiştirmesine izin verir. Değiştirilen sınıfın hedef sınıf olarak "poz vereceği" söylenir. Pozlamayı destekleyen sürümler için, hedef sınıfa gönderilen tüm mesajlar bunun yerine poz sınıfı tarafından alınır.

NSObject, yukarıda belirtildiği gibi mevcut sınıfı değiştirmemizi sağlayan poseAsClass yöntemini içerir.

Poz Verirken Kısıtlamalar

  • Bir sınıf, yalnızca doğrudan veya dolaylı üst sınıflarından biri olabilir.

  • Poz sınıfı, hedef sınıfta bulunmayan herhangi bir yeni örnek değişkenini tanımlamamalıdır (ancak yöntemleri tanımlayabilir veya geçersiz kılabilir).

  • Hedef sınıf, poz öncesinde herhangi bir mesaj almamış olabilir.

  • Bir poz sınıfı, süper aracılığıyla geçersiz kılınan yöntemleri çağırabilir, böylece hedef sınıfın uygulamasını birleştirebilir.

  • Poz sınıfı, kategorilerde tanımlanan yöntemleri geçersiz kılabilir.

#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;
}

Şimdi programı daha eski bir Mac OS X'te (V_10.5 veya öncesi) derleyip çalıştırdığımızda, aşağıdaki sonucu alacağız.

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

Yukarıdaki örnekte, uygulamamızla sadece orijinal yöntemi kirlettik ve bu, yukarıdaki yöntemle tüm NSString işlemlerinde etkilenecektir.