2013-07-16 28 views
5

Bildiğimiz gibi, bir kategori ve objc_setAssociatedObject ve objc_getAssociatedObject gibi çalışma zamanı yöntemlerini kullanarak Objective-C'de bir değişken ekleyebiliriz. Örneğin:objc_setAssociatedObject nasıl çalışır?

#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 

Ama kimse objc_getAssociatedObject veya objc_setAssociatedObject ne yapar biliyor? Yani, nesneye eklediğimiz değişken (burada self) nerede saklanıyor? Ve değişken ile self arasındaki ilişki?

+1

Sadece mülk kullanmamak için herhangi bir sebep var mı? Nasıl çalıştığını anlamadan çalışma zamanı ile uğraşmaya çalışmam. –

+3

[İşte] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) bunların uygulanması. –

+1

@ H2CO3, aslında ilginç bir kod içeren dosya objc-references.mm: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –

cevap

8

İlişkili nesneler için kod, Objective-C çalışma zamanında objc-references.mm 'dadır. Ben doğru anlamak

, bir ObjectAssociationMap için (uintptr_t olarak "gizli") bir nesnenin adresini eşler tek bir küresel karma harita (class AssociationsManager içinde static AssociationsHashMap *_map) bulunmaktadır.

bir nesne için ilk defa çağrıldığında

ObjectAssociationMap saklar belirli bir nesne için tüm dernek ve oluşturulur.

ObjectAssociationMap, key ile value ve policy arasındaki haritaları gösteren bir karma haritasıdır.

Bir nesne ayrılmışsa, _object_remove_assocations() tüm ilişkilendirmeleri kaldırır ve gerekirse değerleri serbest bırakır.

+0

Haklısınız, çalışma zamanına ait bir global karma haritası var ve tüm ilişkili nesneler harita tarafından saklanıyor. Çok teşekkür ederiz! – foogry

+0

@wangzz: Rica ederim! –