1

viewDidUnload は iOS6 では呼び出されなくなったため、viewDidUnload で必要なことを行うアプリの回避策として、次のようにしました。

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];


    // only want to do this on iOS 6
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
        //  Don't want to rehydrate the view if it's already unloaded
        BOOL isLoaded = [self isViewLoaded];

        //  We check the window property to make sure that the view is not visible
        if (isLoaded && self.view.window == nil) {

            //  Give a chance to implementors to get model data from their views
            [self performSelectorOnMainThread:@selector(viewWillUnload)
                                   withObject:nil
                                waitUntilDone:YES];

            //  Detach it from its parent (in cases of view controller containment)
            [self.view removeFromSuperview];
            self.view = nil;    //  Clear out the view.  Goodbye!

            //  The view is now unloaded...now call viewDidUnload
            [self performSelectorOnMainThread:@selector(viewDidUnload)
                                   withObject:nil
                                waitUntilDone:YES];
        }
    }
}

Apple がこのようなものを拒否した前例はありますか? 時間の制約があるため、彼らが何かを拒否する危険を冒すことはできません.

4

2 に答える 2

1

Apple がそれを拒否する理由はありませんが、理由があって削除されました。

手動で呼び出すと、問題が発生するだけです。アプリケーション ロジックを正しく作成し、「正しい」方法で実行することを強くお勧めします。

編集:そのコードをもう一度見た後、私はあなたの実装について深刻な疑問を持っています. セレクターの呼び出し (既にメイン スレッドにいるはずです!) とスーパービューからの削除 (所有者に通知せずにビューを盗むだけ) を含む構造全体は、正しくありません。これは、コード ベースから本当に削除したいタイプのコードです。

于 2012-10-10T21:28:06.083 に答える
0

彼らがこれを拒否する理由はありません。メソッドを非推奨にすることで、-[UIView viewDidUnload]他のメソッドと同じようになります。UIView最初から存在せず、たまたま というメソッドを作成したかのように扱うことができます-viewDidUnload

まだ内部に存在していて (そう-viewDidUnloadかもしれません)、自分の実装ではなく Apple の (現在は非公開の) 実装を呼び出そうとすると問題になりますが、Apple がこれを行うとは思えません。-viewDidUnloadスーパーでメソッドを呼び出す前に、スーパークラスがメソッドを実装しているかどうかを確認することを忘れないでください。

if ([[self superclass] instancesRespondToSelector:@selector(viewDidUnload)]) {
    [super viewDidUnload];
}

本当に安全にしたい場合は、いつでもコードを別のメソッドに移動できます。内部viewDidUnloadでは、iOS 5 デバイスの場合は新しいメソッドを-didReceiveMemoryWarning呼び出し、iOS 6 を使用している場合は新しいメソッドを呼び出します。

didReceiveMemoryWarning のロジックについて詳しくコメントするつもりはありませんが、それは問題ではありませんでしたが、コントローラーを配置している状態について非常に注意する必要があると言います (if ステートメントがカバーされていることを確認してください)。もちろん、View Controller とそのビューが、viewDidUnload が呼び出されたときに、iOS 5 で UIKit によって呼び出されたときと同じ状態になるとは期待できません。

于 2012-10-10T21:23:51.010 に答える