PDF 课件和源代码下载地址:
作者回复: 首先不是所有的Block中持有self都会形成循环引用。 我们先要了解在iOS中内存的管理是使用引用计数的,简单的说就是一个对象如果没有被引用则会被释放销毁。同时通常来说Block本身会对Block中的对象进行持有。 那如果Block是self的一个属性,则self持有Block,而Block中使用self又导致block持有Self,这样就形成了一个循环,导致self和block的引用计数一直不能变成0,不会被系统自动进行释放回收。 了解了这个原理我们就可以发现,比如类方法中的Block,或者作为临时变量的Block,由于self没有对block进行持有,那么在其中即使持有了self也不会导致循环引用,只是会持有self导致self生命周期的释放时机发生改变。
作者回复: 是的,在视频中写成weakself是错误的,之后的代码中已经更正。感谢🙏 另外不调用的情况,简单来说有两种,一种是赋值self的时候没有正确的赋值成功,可以检查下类型,或者赋值后是否有值,另外一种就是在Block执行的时候可以加下断点,看下self是否已经被释放了。如果找不到据具体的问题可以上传下代码我帮看下。
作者回复: 👍
作者回复: 已经解决了就好~
作者回复: 使用这个函数,在集合类型中的数据必须是基本的类型(NSData,NSNumber等等),自定义的类型即使实现了NSCoding也是不行的,需要转换成NSData。具体的文档在https://developer.apple.com/documentation/foundation/nsdictionary/1409634-write。