Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Test/AssociatedObject.m
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ int main(void)

object = [Associated new];
holder = [Test new];
size_t rc = object_getRetainCount_np(object);
for (uintptr_t i = 1; i <= 20; ++i)
{
objc_setAssociatedObject(holder, (void*)i, object, OBJC_ASSOCIATION_RETAIN);
assert(rc + i == object_getRetainCount_np(object));
}
int lost = 0;
for (uintptr_t i = 1; i <= 20; ++i)
Expand All @@ -53,6 +55,7 @@ int main(void)
fprintf(stderr, "lost object %" PRIuPTR "\n", i);
++lost;
}
assert(rc + 20 + i == object_getRetainCount_np(object));
}
[holder release];
[object release];
Expand Down
10 changes: 10 additions & 0 deletions associate.m
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,12 @@ id objc_getAssociatedObject(id object, const void *key)
struct reference *r = findReference(list, key);
if (NULL != r)
{
// Check if the policy is OBJC_ASSOCIATION_{RETAIN, COPY} or OBJC_ASSOCIATION_{RETAIN, COPY}_NONATOMIC (LSB set)
// Apple's objc4 retains and autoreleases the object under these policies
if (r->policy & OBJC_ASSOCIATION_RETAIN_NONATOMIC)
{
objc_retainAutorelease(r->object);
}
return r->object;
}
if (class_isMetaClass(object->isa))
Expand All @@ -364,6 +370,10 @@ id objc_getAssociatedObject(id object, const void *key)
struct reference *r = findReference(list, key);
if (NULL != r)
{
if (r->policy & OBJC_ASSOCIATION_RETAIN_NONATOMIC)
{
objc_retainAutorelease(r->object);
}
return r->object;
}
}
Expand Down
Loading