【问题标题】:Why there is no leak in Grabkit为什么 Grabkit 没有泄漏
【发布时间】:2013-07-28 06:05:14
【问题描述】:

Grabkit 是一个插入式 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(query) -> 块 -> GRKFlickrGrabber(self)

所以这里有一个保留周期。但是当我使用仪器分析 Grabkit Demo 时,没有泄漏。他们是否使用了一些打破retian循环的技巧?

【问题讨论】:

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


    【解决方案1】:

    仅当您希望在对象释放期间对对象具有强引用的 Block 将被释放时,保留循环才有问题。如果 Block 因其他原因被销毁,在此之前 - 例如在查询运行之后 - 循环将被打破。

    【讨论】:

    • 在方法 albumsOfCurrentUserAtPageIndex:withNumberOfAlbumsPerPage:andCompleteBlock:andErrorBlock: 中,albumsQuery = nil 是否释放 albumsQuery
    • 如果用ARC编译,是的。
    • 当我删除albumsQuery = nil 时,它会泄漏。作为块自动保留和释放对象。为什么需要albumsQuery = nil
    • 它打破了保留周期。
    • 大家好,我是 GrabKit 的开发者。 "albumsQuery = nil;"确实是为了让查询被释放,避免泄漏。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2011-02-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多