0

Grabkitは、Facebook、FlickR、Instagram、Picasa から写真を簡単にインポートするためのドロップイン iOS コンポーネントです

Grabkit では、GRKXXXQuery はデリゲート ベースのクエリをブロック ベースのクエリに変換するラッパーです。GRKXXXGrabber は、GRKXXXQuery を使用してクラウド サービスから写真を取得するブロック ベースのクラスです。

たとえば、GRKFlickrXXX を考えてみましょう。GRKFlickrGrabber には、クエリを格納する NSMutableArray があります (スーパー クラス GRKServiceGrabber 内)。メソッドalbumsOfCurrentUserAtPageIndex:withNumberOfAlbumsPerPage:andCompleteBlock:andErrorBlock:では、クエリ (GRKFlickrQuery) が作成され、 を呼び出して NSMutableArray に格納されましたregisterQueryAsLoading:。クエリはブロックをパラメーターとして受け取り、GRKFlickrQuery ではこれらのブロックはインスタンス変数として格納されます。そしてself、これらのブロックにあります

単純に: GRKFlickrGrabber -> NSMutableArray(_queries) -> GRKFlickrQuery(query) -> ブロック -> GRKFlickrGrabber(self)

したがって、ここには保持サイクルがあります。しかし、計測器を使用して Grabkit Demo をプロファイリングすると、リークはありません。彼らは、retian サイクルを破るいくつかのトリックを使用しましたか?

4

2 に答える 2

1

保持サイクルは、オブジェクトへの強い参照を持つブロックがそのオブジェクトの割り当て解除中に割り当て解除されると予想される場合にのみ問題になります。それ以前に、クエリの実行後など、何らかの理由でブロックが破棄された場合、サイクルは中断されます。

于 2013-07-28T06:18:34.440 に答える
1

リテイン サイクルが必ずしもリークにつながるわけではありません。オブジェクトがdealloc(ARCの「自動」deallocを含む)でクリーンアップされると予想される場合、これは単なるリークです。非同期リクエストの最後にブロック プロパティを手動でクリアすると、正常に動作します。

于 2013-07-28T06:26:58.847 に答える