2011-09-15 16 views
0

それは動作します...クラッシュしないで、私が必要なものを行うように見えます。[自己解放]できますか?

これは私のアプリケーションの設計上の欠陥かもしれませんが、私が必要とするものを行う最も簡単な方法です。基本的にビューが表示され、オブジェクト自体の中のコントロールは、スーパービューからいつ削除されるかを決定します(その時点で解放する必要があります)。

[self release]を実行するのが最も簡単です。これは動作するようです。

しかし、私はオブジェクトの所有権を認識していますが、オブジェクト自体を解放するオブジェクトのインスタンス化は、オブジェクト所有権の良い設計ではないことを認識しています。つまり、所有者クラス(新しいオブジェクトをインスタンス化するクラス)それを解放するもの。しかし、これは、オブジェクトを解放するだけで、所有者クラスにコールバックするデリゲートメソッドを記述する必要があります。

お願いします。 :)

おかげ

答えて

2

基本的にビューが表示され、オブジェクト自体のコントロールによって、スーパービューから削除された時点(解放が必要な時点)が決定されます。

通常、スーパービューには子ビューの保持された参照があり、削除されるとその参照は解放されます。なぜあなたは再びそれを解放する必要がありますか?

[自己解放]を行うと、このオブジェクトの所有権を他のコード(保持されている参照を保持している)から削除します。それを行うと、他のコードにはガーベジ・メモリの参照が無制限になります。この他のコードにはこのような状況が通知されるはずです(そして、リリース自体を発行するかもしれません)。

一度スーパービューに追加すると、ただ解放できますか?コードサンプルで

pattern you usually see

UIView *view = [[UIView alloc] initWithFrame...]; 
[self addSubView:view]; 
[view release]; 
+0

は、うーん、あなたは良い点を作るです。スーパービューに追加されたら、ただ解放することができますか? –

+2

これは通常行われる方法です。問題は、サブビューへの参照(保持する必要がある)も必要とする他のオブジェクト(コントローラ)があるときです。しかし、たとえあなたが[自己解放]しても、そのコントローラーは今やごみ箱への参照を持っているので何らかの形で通知を受ける必要があります。 – Thilo

+0

さて、@ Thiloはそうです、ここのケースではUIViewを作成していない、UIViewControllerのビュー(保持しています!) –

1

あなたは何をやっている知っている、とあなたがあなた自身のクラスのクライアントであれば、あなたはいいですよ。 悪いデザインについて:あなたが正しいです。私はあなたが解放したいものをインスタンス化しているクラスに、それが消えていることを通知することを提案し、それをリリースすることができます。あなたは、プロトコル、またはNSNotificationCenterを使用することができます。

関連する問題