Was tracking a memory leak in an existing app and tracked it down to objc_setassociatedobject not working as expected from the code being developed for the Apple Runtime. The docs around objc_setassociatedobject seem to imply it follows the Apple Runtime but this simple gtest will pass on Apple but fail on libobjc/GNUStep Base:
static BOOL deallocCalled = NO;
static const char* objc_setAssociatedObjectKey = "objc_setAssociatedObjectKey";
@interface NSMutableDictionary(setAssociatedObjectTest)
@end
@implementation NSMutableDictionary(setAssociatedObjectTest)
-(void) dealloc
{
deallocCalled = YES;
[super dealloc];
}
@end
TEST(objc_setAssociatedObject, AssociatedObjectsAreReleased)
{
@autoreleasepool {
NSObject* object = [[NSString alloc] init];
NSMutableDictionary *info = [NSMutableDictionary dictionaryWithCapacity:1];
objc_setAssociatedObject(object, &objc_setAssociatedObjectKey, info, OBJC_ASSOCIATION_RETAIN);
[object release];
}
ASSERT_TRUE(deallocCalled);
}
Shows that the dictionary leaks.