1

ビューとして表示されない iOS クラスで

@interface MyDataClass : NSObject{}

メソッドを安全に呼び出すことができる、viewDidUnloadまたはと同様に、オーバーライドでき、クラスの実行/ライフサイクルの最後に一貫して呼び出されるメソッドはありますか?dealloc

あるいは、そのようなクラスの有用な寿命の完了を認識できるメソッドを実装するにはどうすればよいでしょうか?

4

5 に答える 5

3

NSObjectサブクラスがメモリから解放された場合に呼び出される最後のメソッドはdeallocだと思います。

- (void)dealloc
{
    [super dealloc];
}
于 2012-06-18T11:27:23.700 に答える
2

お気に入り

- (void)dealloc
{
    [super dealloc];
}

于 2012-06-18T11:27:25.087 に答える
1

dealloc(オブジェクトの割り当てが解除されたときではなく)メモリ不足の状態で呼び出される以外の別のメソッドが必要だと想像してみてください。どのオブジェクトがそのメソッドを呼び出しますか?

viewDidUnloadUIフレームワークの一部であり、UIフレームワークによって呼び出されます。アプリケーションがメモリ不足状態に関するメッセージを受け取ると、フレームワークはメッセージをすべてのアクティブなViewControllerにリダイレクトするだけです。

カスタムクラスにメソッドを作成して同じことを実装できます。たとえば-(void)onLowMemory、メソッドからアプリケーションデリゲートからapplicationDidReceiveMemoryWarningメソッドを呼び出すか、クラスを登録してリッスンすることができますUIApplicationDidReceiveMemoryWarningNotification

于 2012-06-18T12:31:55.293 に答える
1

クラス全体 (インスタンスではなく)の存続期間の終わりに実行されるメソッドを意味する場合、クラスの使用がいつ終了したかをランタイムがどのように認識しているのか疑問に思います (いつでも新しいインスタンスを作成できます)。 ? メソッドはありますが+initialize、技術的にはクラス自体は永久に (プログラムが終了するまで) 利用可能です。

インスタンスの存続期間を意味する場合、探しているメソッドは です-dealloc

-dealloc は、オブジェクトの内部参照カウントがゼロになるたびに呼び出されます。非 ARC コードでは、それをオーバーライドする場合、スーパークラスの実装を呼び出す必要があります。これにより、最終的にNSObject-dealloc呼び出され、そのときにメモリが解放されます。

編集:メモリ不足の状況に関しては、通知を登録する方法は次のとおりです。

// Somewhere inside the -init method of your class
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(myMethod:) 
                                             name:UIApplicationDidReceiveMemoryWarningNotification 
                                           object:nil];

dealloc 内では、これを行う必要があります。

[[NSNotificationCenter defaultCenter] removeObserver:self];

...そうしないと、アプリがクラッシュする可能性があります。

そしてもちろん、メモリ不足の状況で呼び出される次のシグネチャを持つメソッドを実装する必要があります。

- (void) myMethod:(NSNotification*) notification
{
   // Do some cleanup here, perhaps.
}

(そうしないと、アプリがクラッシュします)

于 2012-06-18T11:29:54.487 に答える
0

このstackoverflowリンクは多かれ少なかれ私の質問に答えますが、完全ではありません。私の質問は、単純に答えられるものではなく、アーキテクチャまたはメソッドの調達と手順に関係していると思います。

于 2012-06-18T13:12:40.733 に答える