2

NSKeyValueChange を使用して、Web サービスから画像を取得した後、テーブルビューに表示される画像を更新しています。

- (void)observeValueForKeyPath:(NSString *)keyPath
              ofObject:(id)object
                change:(NSDictionary *)change
               context:(void *)context {

if ([keyPath isEqual:@"thumbnail"]) {
  UIImage* newImage = [change objectForKey:NSKeyValueChangeNewKey];
  if (newImage != (id)[NSNull null]) {
    self.thumbContainer.image = newImage;
    [self.thumbContainer setNeedsLayout];
  }
}

}

[item addObserver:cell forKeyPath:@"thumbnail" options:NSKeyValueObservingOptionNew context:NULL];

ECSlidingViewController という名前のサードパーティ ライブラリ内にナビゲーション全体を追加して、Facebook や Sparrow Mail アプリと同様の左側のナビゲーションを作成するまで、すべて正常に機能していました。

今、私のアプリはクラッシュしています。以下は、一番下に到達したときにテーブルビューにさらにセルをロードしようとしたときに得られる画像です。

ここに画像の説明を入力

上の画像でわかるように、問題の正確な場所をトラブルシューティングするだけでは十分ではありません。メイン スレッドのクラッシュに関連する StackOverflow で同様の問題を確認しようとしましたが、役に立ちませんでした。

誰かがそれを調べて、どこに問題があるのでしょうか。前もって感謝します。

更新: プログラムを実行できますが、下にスクロールしてさらにセルを表示すると、この問題によりプログラムがクラッシュします。

4

1 に答える 1

2

msgSend呼び出しでクラッシュしました。つまり、(obj-cオブジェクトではなく)不正なポインターで関数呼び出しを送信します。

[item addObserver:cell forKeyPath:@"thumbnail" options:NSKeyValueObservingOptionNew context:NULL];

暗黙のサブスクリプションを作成しました。アイテムが解放されても、オブザーバーはまだアイテムを登録しています。

Appleのドキュメントから:addObserver:forKeyPath:options:context:...レシーバーもanObserverも保持されません

したがって、クリーンに保つには、アイテムが解放される前に、removeObserver:forKeyPath:context:を実装する必要があります。あなたはセルでKVOだと思いますが、セルのメモリ管理にアクセスできないため、これは悪い考えです(割り当てに応答し、tableViewcellは必要なセルの量を自分で管理します)。

したがって、可能な場合はKVOのサブスクライブとサブスクライブ解除を行ってください。

私はあなたがアイデアを得ることを願っています;)

于 2013-03-15T08:52:48.327 に答える