Skip to content

Instantly share code, notes, and snippets.

@manajay
Last active March 8, 2020 04:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manajay/d729dc8d5fa1e5094e668104060774cb to your computer and use it in GitHub Desktop.
Save manajay/d729dc8d5fa1e5094e668104060774cb to your computer and use it in GitHub Desktop.
研究OC在ARC下内存释放的问题代码
#import "ReleaseViewController.h"
void testStrongRelease0(void) ;
void testStrongRelease1(void) ;
void testStrongRelease2(void) ;
#define MNJSpaceLog() do { NSLog(@"\n\n");} while(0)
@interface MNJObject : NSObject
+ (instancetype)object;
@end
@implementation ReleaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
// 最开始只是想看看 ARC 到底 在编译期 如何自动插入 retain release 的, 结果遇到下面的问题.
// 问题 什么时候用@autoreleasepool
// 针对回答: 写循环,循环里面包含了大量临时创建的对象
// 下面的测试有哪些问题
// 带着疑问 1. for 循环创建大量临时对象, 什么时候会释放, 2. 当前线程是主线程, 那会不会添加到主线程的自动释放池 3. 添加了 autoreleasepool 内存释放会有什么变化吗?
// 测试环境: 模拟器与真机(iPhone 7) 运行结果一样, 运行Debug和Release结果一样
testStrongRelease0();
MNJSpaceLog();
testStrongRelease1();
MNJSpaceLog();
testStrongRelease2();
}
@end
void testStrongRelease0() {
NSLog(@"---------------- testStrongRelease0 ----------------");
for (int i =0;i<4;i++) {
__strong MNJObject * holder = [MNJObject new];
NSLog(@"inner object : %@ \n",holder);
MNJSpaceLog();
}
NSLog(@"---------------- testStrongRelease0 ----------------\n \n");
}
void testStrongRelease1() {
NSLog(@"---------------- testStrongRelease1 ----------------");
__strong MNJObject * holder = nil;
for (int i =0;i<4;i++) {
holder = [MNJObject new];
NSLog(@"inner object : %@ \n",holder);
MNJSpaceLog();
}
NSLog(@"outer holder : %@",holder);
NSLog(@"---------------- testStrongRelease1 ----------------\n \n");
}
void testStrongRelease2() {
NSLog(@"---------------- testStrongRelease2 ----------------");
__strong MNJObject * holder = nil;
@autoreleasepool {
for (int i =0;i<4;i++) {
@autoreleasepool {
holder = [MNJObject new];
NSLog(@"inner @autoreleasepool object : %@ \n",holder);
MNJSpaceLog();
}
}
NSLog(@"outer @autoreleasepool holder : %@",holder);
MNJSpaceLog();
}
NSLog(@"outer holder : %@",holder);
NSLog(@"---------------- testStrongRelease2 ----------------\n \n");
}
void testStrong (){
MNJObject *obj = nil;
{
obj = [[MNJObject alloc] init];
NSLog(@"inner obj:%@",obj);
};
NSLog(@"outer obj:%@",obj);
// 临时对象的作用域是什么
}
void testWeak (){
__weak MNJObject *obj = nil;
{
obj = [[MNJObject alloc] init];
NSLog(@"inner obj:%@",obj);
};
NSLog(@"outer obj:%@",obj);
// 临时对象的作用域是什么
}
void testWeak1(){
__weak MNJObject *obj = nil;
{
obj = [MNJObject object]; // 返回一个自动释放的对象
NSLog(@"inner obj:%@",obj);
};
NSLog(@"outer obj:%@",obj);
// 后面也没有释放
// 临时对象的作用域是什么
}
void testWeak2(){
__weak MNJObject *obj = nil;
@autoreleasepool {
obj = [MNJObject object]; // 返回一个自动释放的对象
NSLog(@"inner obj:%@",obj);
};
// 后面释放
NSLog(@"outer obj:%@",obj);
// 临时对象的作用域是什么
}
@implementation MNJObject
+ (instancetype)object {
return [MNJObject new];
}
- (void)dealloc {
NSLog(@"MNJObject dealloc : %@",self);
MNJSpaceLog();
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment