Danh mục Objective-C
Đôi khi, bạn có thể thấy rằng bạn muốn mở rộng một lớp hiện có bằng cách thêm hành vi chỉ hữu ích trong một số trường hợp nhất định. Để thêm phần mở rộng như vậy vào các lớp hiện có, Objective-C cung cấpcategories và extensions.
Nếu bạn cần thêm một phương thức vào một lớp hiện có, có lẽ, để thêm chức năng nhằm giúp bạn dễ dàng thực hiện điều gì đó hơn trong ứng dụng của mình, cách dễ nhất là sử dụng một danh mục.
Cú pháp để khai báo một danh mục sử dụng từ khóa @interface, giống như mô tả lớp Objective-C tiêu chuẩn, nhưng không chỉ ra bất kỳ sự kế thừa nào từ một lớp con. Thay vào đó, nó chỉ định tên của danh mục trong dấu ngoặc đơn, như thế này:
@interface ClassName (CategoryName)
@end
Đặc điểm của loại
Một danh mục có thể được khai báo cho bất kỳ lớp nào, ngay cả khi bạn không có mã nguồn triển khai ban đầu.
Bất kỳ phương thức nào mà bạn khai báo trong một danh mục sẽ có sẵn cho tất cả các thể hiện của lớp gốc, cũng như bất kỳ lớp con nào của lớp gốc.
Trong thời gian chạy, không có sự khác biệt giữa phương thức được thêm bởi một danh mục và một phương thức được thực thi bởi lớp ban đầu.
Bây giờ, hãy xem xét một triển khai danh mục mẫu. Hãy thêm một danh mục vào lớp Cacao NSString. Danh mục này sẽ giúp chúng tôi có thể thêm một phương thức mới getCopyRightString để giúp chúng tôi trả về chuỗi bản quyền. Nó được hiển thị bên dưới.
#import <Foundation/Foundation.h>
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end
@implementation NSString(MyAdditions)
+(NSString *)getCopyRightString {
return @"Copyright TutorialsPoint.com 2013";
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@",copyrightString);
[pool drain];
return 0;
}
Bây giờ khi chúng ta biên dịch và chạy chương trình, chúng ta sẽ nhận được kết quả như sau.
2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright TutorialsPoint.com 2013
Mặc dù bất kỳ phương thức nào được thêm bởi một danh mục đều có sẵn cho tất cả các phiên bản của lớp và các lớp con của nó, bạn sẽ cần phải nhập tệp tiêu đề danh mục trong bất kỳ tệp mã nguồn nào mà bạn muốn sử dụng các phương thức bổ sung, nếu không bạn sẽ gặp phải cảnh báo và lỗi trình biên dịch.
Trong ví dụ của chúng tôi, vì chúng tôi chỉ có một lớp duy nhất, chúng tôi chưa bao gồm bất kỳ tệp tiêu đề nào, trong trường hợp này, chúng tôi nên bao gồm các tệp tiêu đề như đã nói ở trên.