0

アプリで興味深い問題をデバッグしています。

アプリは iOS6.1 を対象としており、ARC を使用しています。SOにコピーペーストするには大きすぎるため、ここにいくつかの背景があります。

子ビュー コントローラーを持つダッシュボード クラスがあります。この子ビュー コントローラーはかなり大きく、ダッシュボード コントローラーが渡す CoreData オブジェクトに基づいて動的に作成される 2 つのスクロール ビューのボタンがあります。ダッシュ ボード コントローラーが子コントローラーで完了すると、それを破棄し、別のコア データ オブジェクトを使用して別のコントローラーを作成します。

動的に作成されて UIScrollView に詰め込まれる子コントローラーのビューの 1 つは、UIWebView のサブクラスです。これをサブ Web と呼びましょう。SubWeb のインスタンスが作成されると、NSOperationBlock を使用して、ネットワーク経由でファイルのフェッチを行い、他の処理 (ディスクへの書き込み、暗号化など) も行います。完了したら、ファイルまたは Web ページを SubWeb インスタンスに挿入できる必要があります。

SubWeb に強力なプロパティを与えることでこれを解決しました。これは私の問題です。私のクリーンアップでは、子ビュー コントローラーまたはサブビューを破棄することはできません。これは、私のクラスを対象とした楽器割り当て調査で確認しました。子ビュー コントローラー (および SubWeb オブジェクト) を作成および破棄することにより、アプリがクラッシュするまで、子ビュー コントローラーとサブ wWeb オブジェクトの両方のメモリ割り当てを確認できます。奇妙なのは、NSBlockOperation を weak に設定すると、破棄ルーチンが期待どおりに動作することです。

開始する実際のファイルを含むいくつかの SubWeb オブジェクトをフロントロードするだけなので、強力な参照が必要です。ユーザーがそれらにスクロールすると、プロパティをプッシュして必要なファイルを遅延ロードします

子ビュー コントローラーと SubWeb ビューのインスタンスがクリーンアップされていない場合に参照している WebView を次に示します。

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (strong) NSBlockOperation *fileLoadOperation;

@end

クリーンアップされたときの WebView を次に示します (ただし、必要なときに遅延ブロック操作が null になるようになりました:

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (weak) NSBlockOperation *fileLoadOperation;

@end

唯一の違いは、強いタイプと弱いタイプです。このタイプの遅延読み込みアクションに NSBLockOperation を使用したことのある人はいますか? 遅延ロードを解決するために使用できる異なる/より良い方法はありますか?

4

1 に答える 1

1

NSBlockOperationオブジェクトを作成するためのロジックに従っていませんstrong。一般的にはweakです。操作が完了すると、操作オブジェクトを保持する必要がなくなります。

メモリ消費に関する質問への回答では、間違いなく強力な参照サイクル (保持サイクル) があるため、メモリが不足しています。ブロックに参照がある場合self(コントローラーのインスタンス変数の一部を明示的に参照するか、暗示的に参照するかを問わず)、強い参照サイクル (つまり、2 つのオブジェクトが相互に強い参照を維持するため、どちらも取得しない) になる可能性があります。手動でクリーンアップしない限り、割り当てが解除されます)。

リテイン サイクルの詳細については、『Advanced Memory Management Programming Guide』のUse Weak References to avoid Retain Cycles を参照してください。また、「Objective-C を使用したプログラミング」ガイドの「キャプチャ時に強力な参照サイクルを回避する」も参照してください。self

于 2013-06-22T01:22:35.997 に答える