Tư thế Objective-C
Trước khi bắt đầu về Posingtrong Objective-C, tôi muốn thông báo với bạn rằng tính năng tạo dáng đã được tuyên bố là không được chấp nhận trong Mac OS X 10.5 và nó sẽ không khả dụng sau đó. Vì vậy, đối với những người không quan tâm đến các phương pháp không dùng nữa có thể bỏ qua chương này.
Objective-C cho phép một lớp thay thế hoàn toàn một lớp khác trong một chương trình. Lớp thay thế được cho là "đóng vai" lớp mục tiêu. Đối với các phiên bản hỗ trợ tạo dáng, thay vào đó, tất cả các thông báo được gửi đến lớp đích sẽ được lớp tạo dáng nhận.
NSObject chứa phương thức poseAsClass - cho phép chúng ta thay thế lớp hiện có như đã nói ở trên.
Hạn chế trong tư thế
Một lớp chỉ có thể đóng vai trò là một trong các lớp cha trực tiếp hoặc gián tiếp của nó.
Lớp đặt ra không được xác định bất kỳ biến thể hiện mới nào vắng mặt trong lớp đích (mặc dù nó có thể định nghĩa hoặc ghi đè các phương thức).
Lớp mục tiêu có thể không nhận được bất kỳ tin nhắn nào trước khi đặt ra.
Một lớp đặt ra có thể gọi các phương thức được ghi đè thông qua siêu, do đó kết hợp việc thực thi lớp đích.
Một lớp đặt ra có thể ghi đè các phương thức được xác định trong các danh mục.
#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;
}
Bây giờ khi chúng tôi biên dịch và chạy chương trình trong Mac OS X cũ hơn (V_10.5 trở xuống), chúng tôi sẽ nhận được kết quả sau.
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
Trong ví dụ trên, chúng tôi chỉ làm ô nhiễm phương thức gốc với việc triển khai của chúng tôi và điều này sẽ bị ảnh hưởng trong suốt tất cả các hoạt động của NSString với phương thức trên.