存储消耗空间:RAM ROM
内存模型:CG ARC MRC
内存变量:堆 栈 静态区
循环引用在block函数中经常发生举个例子 建立两个全局变量 一个为block 另一个是str
@interface NextViewController ()
@property (nonatomic,strong) dispatch_block_t block;
@property (nonatomic,copy) NSString *str;
@end
@implementation NextViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"Test Block";
__weak typeof(self) weakSelf = self;
self.block = ^(){
weakSelf.str = @"222222";
__strong typeof (self) strongSelf = weakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"str===%@",strongSelf.str);
});
};
self.block();
}
- (void)dealloc{
NSLog(@"dealloc");
}
block 函数作用域中引用了self 这会循环引用导致内存泄露,为了打破循环引用我们这里引入 __weak typeof(self) weakSelf = self; 将其变量str赋值 但是在block中增加一个耗时线程的操作,这里就得引入 __strong typeof (self) strongSelf = weakSelf;
这样就可以将str的变量在5秒钟之后打印出来.分析如下: __strong typeof (self) strongSelf = weakSelf; self 引用计数+1
block 可以捕获局部变量,block 是li名函数在函数内声明的变量 在函数结束后立即回收 那么self 引用计数-1
最后在pop该VC之后就可以调用dealloc函数