2009-12-16 24 views
8

kullanılamaz, elma ilişkili nesneler için destek eklendi. Ancak, simülatör, objc_setAssociatedObject, objc_getAssociatedObject ve diğerlerine yapılan başvuruları içeren kodu derlemeyecektir. (Bildirilmemiş hataları)objc_setAssociatedObject 3.1 SDK'sında iPhone simülatörü

uzaklıkta etrafında var mı? IPhone simulatörü bu kodu derleyebilir miyim? Cihazda tüm testleri yapmaktan nefret ediyorum.


Güncelleme

Hata Under: rdar: // 7477326

+1

Eğer 10.5 veya geliştirme için 10.6 kullanıyorsunuz? –

+0

10.6, Fresh Kurmak –

+2

http://bugreport.apple.com/ adresinden bir hata yapın ve #, dahil etmek için sorunuzu düzenleyin, lütfen. – bbum

cevap

1

hızlı ve kirli çözüm (büyük ölçüde denenmemiş, arabası olabilir):

#if TARGET_IPHONE_SIMULATOR 

#import <objc/runtime.h> 

enum { 
    OBJC_ASSOCIATION_ASSIGN = 0, 
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 
    OBJC_ASSOCIATION_RETAIN = 01401, 
    OBJC_ASSOCIATION_COPY = 01403 
}; 
typedef uintptr_t objc_AssociationPolicy; 

@implementation NSObject (OTAssociatedObjectsSimulator) 

static CFMutableDictionaryRef theDictionaries = nil; 

static void Swizzle(Class c, SEL orig, SEL new) // swizzling by Mike Ash 
{ 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(c, new); 
    if (class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    else 
     method_exchangeImplementations(origMethod, newMethod); 
} 

- (NSMutableDictionary *)otAssociatedObjectsDictionary 
{ 
    if (!theDictionaries) 
    { 
     theDictionaries = CFDictionaryCreateMutable(NULL, 0, NULL, &kCFTypeDictionaryValueCallBacks); 
     Swizzle([NSObject class], @selector(dealloc), @selector(otAssociatedObjectSimulatorDealloc)); 
    } 

    NSMutableDictionary *dictionary = (id)CFDictionaryGetValue(theDictionaries, self); 
    if (!dictionary) 
    { 
     dictionary = [NSMutableDictionary dictionary]; 
     CFDictionaryAddValue(theDictionaries, self, dictionary); 
    } 

    return dictionary; 
} 

- (void)otAssociatedObjectSimulatorDealloc 
{ 
    CFDictionaryRemoveValue(theDictionaries, self); 
    [self otAssociatedObjectSimulatorDealloc]; 
} 

@end 

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) 
{ 
    NSCAssert(policy == OBJC_ASSOCIATION_RETAIN_NONATOMIC, @"Only OBJC_ASSOCIATION_RETAIN_NONATOMIC supported"); 

    [[object otAssociatedObjectsDictionary] setObject:value forKey:[NSValue valueWithPointer:key]]; 
} 

id objc_getAssociatedObject(id object, void *key) 
{ 
    return [[object otAssociatedObjectsDictionary] objectForKey:[NSValue valueWithPointer:key]]; 
} 

void objc_removeAssociatedObjects(id object) 
{ 
    [[object otAssociatedObjectsDictionary] removeAllObjects]; 
} 

#endif 
3

ı don Bunun 3.x SDK'larda düzeltileceğini düşünün, bu yüzden başka bir düzeltme sadece işlevleri tanımlamak ve bir sonraki tanımlamaya geçmek Dinamik bir arama.

Başlık:

#if TARGET_IPHONE_SIMULATOR 
enum { 
    OBJC_ASSOCIATION_ASSIGN = 0, 
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 
    OBJC_ASSOCIATION_RETAIN = 01401, 
    OBJC_ASSOCIATION_COPY = 01403 
}; 
typedef uintptr_t objc_AssociationPolicy; 

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy); 
id objc_getAssociatedObject(id object, void *key); 
void objc_removeAssociatedObjects(id object); 
#endif 

Uygulama:

#if TARGET_IPHONE_SIMULATOR 
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) { 
    ((void (*)(id, void *, id, objc_AssociationPolicy)) 
    dlsym(RTLD_NEXT, "objc_setAssociatedObject")) (object, key, value, policy); 
} 
id objc_getAssociatedObject(id object, void *key) { 
    return ((id (*)(id, void *)) 
      dlsym(RTLD_NEXT, "objc_getAssociatedObject"))(object, key); 
} 
void objc_removeAssociatedObjects(id object) { 
    ((void (*)(id)) 
    dlsym(RTLD_NEXT, "objc_removeAssociatedObjects"))(object); 
} 
#endif 
+0

Teşekkürler! Ayrıca RTLD_NEXT çözümlemek için #define _GNU_SOUCE eklemek zorunda kaldı. –

İlgili konular