1

あるビューから別のビューに切り替えると、ロードされようとしているビューに通知を呼び出してコンテンツを更新するという 2 つのビューがあります。奇妙なことに、ビューが初めてロードされるときは 1 回呼び出され、次回は 2 回呼び出されるということです。ビューが読み込まれるたびに追加され続けるためだと結論付けました。dealloc は呼び出されないため、まだそこにあり、追加し続けます。

この問題を解決するために追加される前に、通知が存在するかどうかを確認する方法はありますか?

これが私のviewDidLoadにあるものです

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadGridNotification:) name:@"ReloadOHGridView" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadBadgeNotification:) name:@"reloadBadge" object:nil];

そして私のdealloc:

[[NSNotificationCenter defaultCenter] removeObserver:self];

ありがとう!
コールトン

編集1:

ビューを UINavigationController に表示し、ビューを切り替えます。別のビューを更新するコードは次のとおりです。

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadBadge" object:self];
}
4

2 に答える 2

2

addObserverを呼び出すたびに、通知センターはその内部構造にエントリを追加します。これは、viewDidLoadを呼び出すたびに、通知センターがオブザーバーをもう一度呼び出すことを意味します。

ビューが何らかの理由でアンロードされてから再ロードされると、viewDidLoadが再度呼び出されます。オブジェクトが破棄されるまで、removeobserverは呼び出されません。これは、removeobserverが機能しなかった理由を説明している可能性があります。

フラグを使用してaddObserverを既に呼び出しているかどうかを確認するか、viewDidUnloadメソッドでビューをアンロードするときにremoveObserverを使用してオブザーバーを手動で削除する必要があります。

編集1:または、App Delegateのように、別の場所にオブザーバーを追加できますか?

于 2011-04-18T00:53:13.040 に答える
0

メモリが不足すると、OS はビューをダンプしますが、最初にviewDidUnload;を呼び出します。それらをリロードする必要がある場合は、 を呼び出しますviewDidLoaddeallocただし、ビューへのすべての参照が解放されたときにのみ呼び出されます。これは、アプリが終了するまで発生しない可能性があります。

その結果、@futureelite7 が指摘したように、ビューがリロードされるたびに新しいオブザーバーを追加していますが、事実上、それを削除することはありません。

あなたがする必要があるのは、複数の通知の問題が発生しないように、オブザーバーが追加viewDidLoadおよび削除されていることを確認することだけです。viewDidUnloadフラグやオブザーバーを他の場所に置く必要はありません。

あなたのコメントから、それを試したように思えますが、コードを調べて、DidLoad にのみ追加し、DidUnload では常に削除していることを完全に確認することをお勧めします。アプリごとに魅力的に機能します。


編集して追加

ビューは手動でアンロードされ続けるため、ビューへのすべての参照が失われた場合、またはメモリが不足した場合にのみ発生します。ビューを維持するためにできることを確実に行うために、3 つすべてを確認することをお勧めします。その周り。

于 2011-04-18T01:21:59.393 に答える