循环引用01
Person *p = [[Person alloc] init];
p.age = 19;
p.block = ^{
NSLog(@"%i",p.age);
};
上面的代码即使对象过了作用域也不会被销毁,因为两个强引用问题,互相强引用,导致双方都无妨释放。
block和person之间的引用图
block和self之间引用
循环引用02-ARC01
用__weak、__unsafe_unretained解决,当这个指向的对象销毁之后,__weak会将这指向nil指针,而__unsafe_unretained还是指向原来的地址,是一块已经回收的地址,会产生野指针错误
block使用弱指针访问person
Person *p = [[Person alloc] init];
__weak Person *weakP = p;
p.age = 19;
p.block = ^{
NSLog(@"%i",weakP.age);
};
p.block();
__unsafe_unretained(不常用)
循环引用03-ARC02
用block解决
__block Person *p = [[Person alloc] init];
// __weak Person *weakP = p;
p.age = 19;
p.block = ^{
NSLog(@"%i",p.age);
p = nil;
};
p.block();
NSLog(@"%i", p.age);
一旦执行了 p = nil,他就不是一个循环了,但是必要执行一个block,
内部原理
循环引用04-MRC
MRC不支持__weak,MRC下__block不会对那个对象产生强引用
MRC解决循环引用
答疑问
block的原理是怎样的?本质是什么?
封装了函数调用以及调用环境的OC对象
__block的作用是什么?有什么使用注意点?
一旦本修饰,让他回把变量包装成一个对象,解决block内部无法修改auto变量的问题,
使用注意点,mrc环境下是不会对oc对象变量产生强引用的
block的属性修饰词为什么是copy?使用block有哪些使用注意?
block一旦没有进行copy操作,,他就是在栈上或者是全局区,
就不会在堆上,我们把他放到堆上是为了我们自己控制他的生命周期,
使用注意:循环引用问题
block在修改NSMutableArray,需不需要添加__block
不需要,我们修改arrat是使用指针,而不是改变指针。
strong 和 copy有什么区别?
在arc环境下面,没有区别。就算我们使用strong指向block他也会自动copy。mrc环境下都是靠我们自己管理。
block中不能用弱指针访问person的age变量,解决编译器报错的问题2包住self的命,因为他有可能是空的,所以把他变成强指针。但是,假如block是属于self的,self其实是不会死的,
__weak typeof(self) weakSelf = self;
void (^block)(void) = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%i", strongSelf.age);
};
block();
网友评论