2013-07-16 41 views
5

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_setAssociatedObjectobjc_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?

+1

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. –

+3

[Đây là] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) triển khai của chúng. –

+1

@ 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 –

Trả lời

8

Mã cho các đối tượng liên quan nằm trong objc-references.mm trong thời gian chạy Objective-C.

Nếu tôi hiểu nó một cách chính xác, có một bản đồ toàn cầu băm (static AssociationsHashMap *_map trong class AssociationsManager) mà các bản đồ địa chỉ của một đối tượng ("trá hình" như uintptr_t) đến một ObjectAssociationMap.

ObjectAssociationMap lưu trữ tất cả các hiệp hội cho một đối tượng cụ thể và được tạo ra khi

được gọi là lần đầu tiên cho một đối tượng.

ObjectAssociationMap là bản đồ băm bản đồ số key đến valuepolicy.

Khi đối tượng được deallocated, _object_remove_assocations() xóa tất cả các liên kết và giải phóng các giá trị nếu cần.

+0

Bạn có quyền, có một bản đồ băm toàn cầu thuộc sở hữu của thời gian chạy, và tất cả các đối tượng liên quan được lưu trữ bởi bản đồ. Cảm ơn bạn rất nhiều! – foogry

+0

@wangzz: Bạn được chào đón! –

Các vấn đề liên quan