Last active
March 8, 2020 04:52
-
-
Save manajay/d729dc8d5fa1e5094e668104060774cb to your computer and use it in GitHub Desktop.
研究OC在ARC下内存释放的问题代码
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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