一篇文章让你看懂IOS中的block为何再也不需要WeakSelf弱引用

2020-01-21 04:05:19王旭

唯一的遗憾,就是跳出函数后,block不能再复用了:

ios,block,weakself,weak,self,弱引用self

8:block的copy方法:

对于默认传进来的block(有三种形态:全局、栈、堆)

全局 copy 还是全局

堆 copy 还是堆

栈 copy 变成堆

说白了,copy只对类型是栈是才有效。

这是因为:栈的block,在执行完后出括号后,直接是销毁对象。

如果有弱引用过去,会造成野指针。

而其它两种类型,销毁时,会将指针指向一个空指针。


addCell=[addCell copy] 和默认copy的属性 _addCell=addCell 也是执行了copy操作。

执行后,addCell的类型就变成堆形态,这样销毁的时候,是空指针。

9:空指针和野指针的区别:

空指针:指向一个:人为创造的一个指针,它的名字叫空,有座空房子,里面什么也没有。

野指针:就是指向的都不知哪去了,连空房子都木有。

10:扩展想象力,如何消灭引用数,还能长久保留?

弱引用的坏处,就是block出了函数,就不再可用这个block了。

那还能怎么办呢?没事,我还有想象力!!!!!

如果block可以重建呢?

比如:

1:将block转成字符串存档,适当时机还原回来重新赋值

2:将block序列化保存,适当时机还原回来?

3:runtime读取block的__FuncPtr,存档再动态创建?

ios,block,weakself,weak,self,弱引用self

伪代码大体如下:


-(void)setAddCell:(AddCellBlock)addCell
{
 addCell=[addCell copy];
 _addCell=addCell;
 
 //_addCell=[addCell copy];这样简写是不行的,不明白为虾米呢
 // 原来是这样写的:
 // __weak AddCellBlock addCellWeak=addCell;
 // _addCell=addCellWeak ;
 
 //存档block的字符串
}
-(void)reloadData
{
 if(!_addCell)
 {
 //从存档的block字符串还原block
 //_addCell=还原block
 }
 if(_addCell)
 {
 _addCell();
 _addCell();
 }
}

那么就剩下两个问题?

1:怎么把block存档?

2:怎么将存档数据还原成block。

对搞C#的来说,这些都家常便饭,oc这块还不熟,有路过的朋友可顺路给支支招!!

11:如果第10的方式解决不了,就只能,只能,引入时机第三者了

不过这个引入第三者,只是一个时机切入点,在这个时机触发的时候,将其中的一方的引用设置为nil。