为什么Grabkit没有泄漏

时间:2013-07-28 06:05:14

标签: objective-c objective-c-blocks memory-leaks

Grabkit是一款Drop-in iOS组件,可轻松导入来自Facebook,FlickR,Instagram,Picasa的照片

在Grabkit中,GRKXXXQuery是一个包装器,它将基于委托的查询转换为基于块的查询.GRKXXXGrabber是一个基于块的类,它使用GRKXXXQuery从云服务中获取照片。

以GRKFlickrXXX为例。 GRKFlickrGrabber有一个存储查询的NSMutableArray(在超类GRKServiceGrabber中)。在方法albumsOfCurrentUserAtPageIndex:withNumberOfAlbumsPerPage:andCompleteBlock:andErrorBlock:中,通过调用registerQueryAsLoading:创建了一个查询(GRKFlickrQuery)并将其存储在NSMutableArray中。查询将块作为参数,在GRKFlickrQuery中,这些块作为实例变量存储。这些块中有self

简单地说:GRKFlickrGrabber - > NSMutableArray(_queries) - > GRKFlickrQuery(查询) - >块 - > GRKFlickrGrabber(个体)

所以这里有一个保留周期。但是当我使用乐器配置Grabkit演示时,没有泄漏。他们是否使用了一些打破retian周期的技巧?

2 个答案:

答案 0 :(得分:1)

如果期望在该对象的释放期间取消分配对对象具有强引用的块,则保留周期才有问题。如果Block因某些其他原因被销毁,那么在此之前 - 例如在查询运行之后 - 该循环将被破坏。

答案 1 :(得分:1)

保留周期不一定会导致泄漏。当你期望在dealloc中清理对象时(包括“自动”的ARC释放),它只是一个泄漏。如果清除块属性,请在手动异步请求结束时说明,它可以正常工作。