アプリで興味深い問題をデバッグしています。
アプリは 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 を使用したことのある人はいますか? 遅延ロードを解決するために使用できる異なる/より良い方法はありますか?