我們的代碼需要時刻避免循環引用的產生,如果 A 引用 B,B 又引用 A,則兩個對象相互持有無法釋放,造成內存泄露。但我們也可以利用這一性質實現一些特殊效果。
莫名其妙的場景需求:
生成一個匿名對象,5秒之后,自動銷毀該對象。
我們知道,一個匿名對象生成之后,如果沒有使用它,則該對象會被立即銷毀。利用循環引用我們可以實現這一過程。
@interface MyObject : NSObject
@end
@interface MyObject ()
@property (strong, nonatomic) id hold;
@end
@implementation MyObject
- (void)dealloc {
NSLog(@"%s", __func__);
}
- (instancetype)init {
NSLog(@"%s", __func__);
if (self = [super init]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
_hold = self;
#pragma clang diagnostic pop
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)),
dispatch_get_global_queue(0, 0), ^{
_hold = nil;
});
}
return self;
}
@end
main.m:
#import "MyObject.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
[MyObject new];
});
while(1);
}
return 0;
}
Log:
2016-02-25 12:01:36.984 test[17700:813144] -[MyObject init]
2016-02-25 12:01:42.398 test[17700:813179] -[MyObject dealloc]