2009-07-31 14 views
0

UIViewからUILabelを動的に削除したいと考えています。いくつかの分岐とループがあり、最終的には 'removeFromSuperview'によってsdkを削除すると、もう存在しないのでsdkがクラッシュすることがあります。オブジェクトがiPhone SDKに存在する場合にのみオブジェクトを削除する方法はありますか?

[lbl_timer removeFromSuperview]; 

だから、オブジェクトが存在するかどうかをどうやって知りたいのですか?あなたが意味する「存在」することによって

おかげ

答えて

0

さまざまな意味で「存在」が意味する意味を明確にする必要があります。

この場合、オブジェクトのretainCountがあなたの存在の定義を満たしていることがあります。 Objective-Cのメモリ管理に精通していない場合は、オブジェクトのretainCountが0になると、割り当てが解除され、通常は存在しなくなることを認識してください。

if ([lbl_timer retainCount] >= 1) { 
    // The object is owned/retained by at least one thing, 
    // assuming a parentview is an owner 
    [lbl_timer removeFromSuperview]; 
} else { 
    // The object isn't retained by anyone 
} 

これは正直にチェックするために最も信頼性の高いまたは "安全な" 方法ではありません。

編集:解除されたオブジェクトのretainCountを呼び出すとクラッシュするという問題が発生しました。この種のチェックを避けるのが最善の方法です。以下の方法でくっつくことはずっと安全です。


親ビューがないため具体的にクラッシュすることがわかっている場合は、親ビューがあるかどうかを確認できます。

さらに
if ([lbl_timer superview] != nil) { 
    [lbl_timer removeFromSuperView]; 
} 

それもlbl_timerが最初に出nil'dされていないことを確認する方が安全かもしれません。

if (lbl_timer != nil) { 
    if ([lbl_timer superview] != nil) { 
     [lbl_timer removeFromSuperView]; 
    } 
} 
+0

あなたの返事をありがとう。 親のビューがありましたが、既に削除されているかどうかを知りたかったので、2回目の削除でクラッシュしていました。私は別のグローバル変数を変更していましたが、それをフラグとして使用しました。それは緊急だったからです。 私はメモリ管理を見ていきます.'nil 'は私のための新しいアイデアでした。もう一度ありがとうございます – pMan

+0

特にメモリが再利用された場合は、すでに割り当て解除されたオブジェクトに対して 'retainCount'を呼び出すことができるかどうかは不明です。 – notnoop

+0

ああ、良い点。私はそれをテストしなければならないだろうが、それはクラッシュを引き起こすかもしれない。オブジェクトが最初に除外されていないことを確認するためにテストするほうが安全でしょう。 – Neil

1

た場合は、それをする方法はありません「割り当てが解除されていませんでした」。オブジェクトがあったメモリは、すでに新しいオブジェクトで置き換えられている可能性があります。ただし、オブジェクトの割り当てが解除されている場合、スーパービューはそのオブジェクトへの参照を保持するため、スーパービューからすでに削除されているはずです。

リリースを行っている方は、リリース直後にlbl_timernilと設定すると、-removeFromSuperviewがnilオブジェクトに送信され、何もしません。それが不可能な場合は、コードを表示する必要があります。

+0

最後にリリースした後は、常に値を常にnilに設定する必要があります。これは主にdeallocにあります。参照をnilに設定してください。 –

関連する問題