0

5 つのテーブル セルを含む第 1 レベルのビュー コントローラーとして UITableView を実装しています。これらのセルのいずれかをクリックすると、第 2 レベルのビューが表示されます。このレベル ビューの左上には、最初のレベル ビューに戻るための「戻る」ボタンがあります。第 2 レベルのビューで左右にスワイプすると、隣接するビューが連続して表示され、第 1 レベルのビューで隣接するテーブル セルにリンクされます。

実行後、一段目から二段目までOKです。しかし、「戻る」ボタンを押して、第 2 レベルのビューから第 1 レベルのビューに戻ると、次の問題が発生しました。

An instance 0x7a8f130 of class UIScrollView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object.
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. 
Here's the current observation info: (
Context: 0x0, Property: 0x9149570>
)

見つけた

- (void)viewDidUnload
{
    [super viewDidUnload];
    [self.scrollView removeObserver:self forKeyPath:@"frame"];
    [self.scrollView removeFromSuperview];
    _scrollView = nil;
}

GDIInfinitePageScrollViewController.m無限スクロールビューコントローラーを実装するために使用しています。これをコメントアウトしたとき、問題はまだそこにあります。

ブレークポイントを設定NSKVODeallocateBreakすると、次のようになります

0x1170ae0:  pushl  %ebp

しかし、私はそれが何を意味するのか分かりません。

この問題を解決する方法を知っている人はいますか?

4

2 に答える 2

1

そのメッセージが表示される理由は、オブザーバーが削除される前に UIScrollView インスタンスが解放されているためです。

メソッド -(void) viewDidUnload は、ビューが既に解放されているときに呼び出されるため、オブザーバーを削除する呼び出しは遅すぎます。さらに、これは -(void) viewWillUnload とともに iOS 6 で廃止されました。

別の方法として、戻るボタンを押したときにオブザーバーを削除してみてください。

于 2013-07-08T11:05:26.327 に答える