mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
63 lines
1.4 KiB
Objective-C
63 lines
1.4 KiB
Objective-C
#include "ObjCWeak.h"
|
|
#include <objc/runtime.h>
|
|
|
|
extern id _Nullable
|
|
objc_initWeak(id _Nullable * _Nonnull location, id _Nullable val);
|
|
|
|
void tryWeakReferencing(id (^makeThing)(void)) {
|
|
id thingy;
|
|
@autoreleasepool {
|
|
thingy = [makeThing() retain];
|
|
}
|
|
|
|
id weakThingy = nil;
|
|
objc_initWeak(&weakThingy, thingy);
|
|
|
|
@autoreleasepool {
|
|
fputs("before giving up strong reference:\n", stderr);
|
|
id x = objc_loadWeak(&weakThingy);
|
|
if (x) {
|
|
fputs([[x description] UTF8String], stderr);
|
|
fputs("\n", stderr);
|
|
} else {
|
|
fputs("Gone\n", stderr);
|
|
}
|
|
}
|
|
|
|
[thingy release];
|
|
thingy = nil;
|
|
|
|
for (int i = 0; i < 100; i++) {
|
|
@autoreleasepool {
|
|
id tmp = makeThing();
|
|
id weakTmp = nil;
|
|
objc_initWeak(&weakTmp, tmp);
|
|
objc_loadWeak(&weakTmp);
|
|
objc_storeWeak(&weakTmp, nil);
|
|
}
|
|
}
|
|
|
|
@autoreleasepool {
|
|
fputs("after giving up strong reference:\n", stderr);
|
|
id x = objc_loadWeak(&weakThingy);
|
|
if (x) {
|
|
fputs([[x description] UTF8String], stderr);
|
|
fputs("\n", stderr);
|
|
} else {
|
|
fputs("Gone\n", stderr);
|
|
}
|
|
}
|
|
objc_storeWeak(&weakThingy, nil);
|
|
|
|
@autoreleasepool {
|
|
fputs("after giving up weak reference:\n", stderr);
|
|
id x = objc_loadWeak(&weakThingy);
|
|
if (x) {
|
|
fputs([[x description] UTF8String], stderr);
|
|
fputs("\n", stderr);
|
|
} else {
|
|
fputs("Gone\n", stderr);
|
|
}
|
|
}
|
|
}
|