Objc_setAssociatedObject not available in iPhone simulator

In the SDK 3.1 SD, Apple added support for related objects.

However, the simulator will not compile code containing links to objc_setAssociatedObject, objc_getAssociatedObject, etc. (Undeclared errors)

Is it around? Can I get the iPhone simulator to compile this code? I would really like all the tests to be conducted on the device.




Update

Error: rdar: // 7477326

+8
objective-c iphone cocoa-touch ios-simulator
Dec 16 '09 at 17:07
source share
2 answers

A quick and dirty workaround (largely untested, may be wrong):

#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 
+1
Feb 10 2018-10-10
source share

I do not think this will be fixed in the SDK 3.x, so another fix is ​​to simply define the functions and move on to the next definition using dynamic search.

Title:

 #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 

Implementation:

 #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 
+3
Apr 20 '10 at 23:25
source share



All Articles