我們的代碼需要時(shí)刻避免循環(huán)引用的產(chǎn)生段化,如果 A 引用 B,B 又引用 A薪棒,則兩個(gè)對(duì)象相互持有無(wú)法釋放手蝎,造成內(nèi)存泄露。但我們也可以利用這一性質(zhì)實(shí)現(xiàn)一些特殊效果俐芯。
莫名其妙的場(chǎng)景需求:
生成一個(gè)匿名對(duì)象棵介,5秒之后,自動(dòng)銷毀該對(duì)象吧史。
我們知道邮辽,一個(gè)匿名對(duì)象生成之后,如果沒(méi)有使用它,則該對(duì)象會(huì)被立即銷毀吨述。利用循環(huán)引用我們可以實(shí)現(xiàn)這一過(guò)程岩睁。
@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]