手动加入自动释放池块(@autoreleasepool),可以使得占用堆空间
的临时变量得以更早的回收。
考虑点:
- weak 修饰的对象 不增加引用计数;
- [NSObject new] 的时候会开辟堆空间。
写了个小例子如下:
/**
@brief 手动添加autoreleasepool测试
*/
- (void)manualAddAutoreleasePooTest {
__weak NSObject *weakObj;
NSObject *obj1 = [NSObject new];
weakObj = obj1;
NSLog(@"%@--%@", obj1, weakObj);
obj1 = nil;
NSLog(@"%@--%@", obj1, weakObj);
@autoreleasepool{
NSObject *obj2 = [NSObject new];
weakObj = obj2;
NSLog(@"%@--%@", obj2, weakObj);
}
NSLog(@"%@", weakObj);
}
输出结果如下:
Xcode9.4.1 在iPhoneX模拟器及真机12.0(16A5366a)都是这个结果
2018-09-11 22:20:07.323334+0800 QiFirstTasteOfAnimation[2285:483390] <NSObject: 0x28388b130>--<NSObject: 0x28388b130>
2018-09-11 22:20:07.323421+0800 QiFirstTasteOfAnimation[2285:483390] (null)--(null)
2018-09-11 22:20:07.323471+0800 QiFirstTasteOfAnimation[2285:483390] <NSObject: 0x28388b130>--<NSObject: 0x28388b130>
2018-09-11 22:20:07.323488+0800 QiFirstTasteOfAnimation[2285:483390] (null)
一个局部变量对于另一个局部变量有引用关系的情况
可以考虑使用多层的autoreleasepool嵌套的情况,这样内部的autoreleasepool中,没有受到内层autoreleasepool外的变量引用的临时变量的内存可以及时得到回收。并且使得整个外层autoreleasepool中的数组中添加临时变量部分的内存也得以及时回收。
@autoreleasepool{
NSMutableArray *arrM = [NSMutableArray array];
@autoreleasepool{
NSObject *obj2 = [NSObject new];
[arrM addObject:obj2];
weakObj = obj2;
NSLog(@"%@--%@", obj2, weakObj);
}
}
NSLog(@"%@", weakObj);
输出结果如下:
Xcode9.4.1 在iPhoneX模拟器及真机12.0(16A5366a)都是这个结果
2018-09-12 09:12:25.706127+0800 QiFirstTasteOfAnimation[734:13206] <NSObject: 0x604000010380>--<NSObject: 0x604000010380>
2018-09-12 09:12:25.706225+0800 QiFirstTasteOfAnimation[734:13206] (null)
网友评论