Như chúng ta biết, chúng ta có thể thêm một biến trong Mục tiêu-C bằng cách sử dụng một thể loại và phương pháp thời gian chạy như objc_setAssociatedObject
và objc_getAssociatedObject
. Ví dụ:objc_setAssociatedObject hoạt động như thế nào?
#import <objc/runtime.h>
@interface Person (EmailAddress)
@property (nonatomic, readwrite, copy) NSString *emailAddress;
@end
@implementation Person (EmailAddress)
static char emailAddressKey;
- (NSString *)emailAddress {
return objc_getAssociatedObject(self,
&emailAddressKey);
}
- (void)setEmailAddress:(NSString *)emailAddress {
objc_setAssociatedObject(self,
&emailAddressKey,
emailAddress,
OBJC_ASSOCIATION_COPY);
}
@end
Nhưng không ai biết objc_getAssociatedObject
hoặc objc_setAssociatedObject
làm gì? Ý tôi là, biến chúng ta thêm vào đối tượng ở đâu (ở đây là self
) được lưu trữ? Và mối quan hệ giữa biến và self
?
Bất kỳ lý do gì để không chỉ sử dụng tài sản? Tôi sẽ cố gắng không gây rối với thời gian chạy mà không hiểu cách nó hoạt động. –
[Đây là] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) triển khai của chúng. –
@ H2CO3, tệp có mã thực sự thú vị là objc-references.mm: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –