0

Objective-C でオブジェクトをプログラミングするときに、ちょっとした質問があります。ほぼ完全なアプリがあり、すべて正常に動作します。私の質問は、オブジェクトを nil に設定し、適切なタイミングで解放することです。

しかし、これで十分ですか、いつどこで removefromsuperview を使用する必要がありますか?

UITableViewCell に UIButton を追加する場合、次のコードで UIButton を追加します。

UIButton *buttonReset = [UIButton buttonWithType:UIButtonTypeContactAdd];
buttonReset.frame = CGRectMake(250.0f, 7.0f, 75.0f, 30.0f);
[cell addSubview:buttonReset];
buttonReset addTarget:self action:@selector(resetSettings) forControlEvents:UIControlEventTouchUpInside];
buttonReset = nil;
[buttonReset release];

私も使う必要がありますか

[buttonReset removeFromSuperview];

この場合?

4

4 に答える 4

5
buttonReset = nil;
[buttonReset release];

これは意味がありません。(null ポインター)へのポインターを設定し、nilそれにメッセージを送信します。他のほとんどの言語では、これによりクラッシュが発生します。Objective-C では許可されていますが、何も起こりません。releaseに設定する前に行う必要がありnilます。ただし、この場合はどちらも行うべきではありません。これbuttonResetは、自動解放されたオブジェクト (作成に alloc/init を使用していない) であるため、所有していないため、解放してはなりません。

この場合も使用する必要はありませんremoveFromSuperview。ボタン (サブビュー) をセル (スーパービュー) に追加します。スーパービューは、ボタンの強力な (保持する) 参照を保持します。セルが解放されると、そのサブビューもすべて処理されます。実際に削除したい場合にのみ自分で削除する必要がありますが、メモリ管理上の理由からではありません。

まだ知らなかった場合は、将来的に自動参照カウント (ARC)の使用を検討することをお勧めします。

于 2013-04-02T14:44:10.013 に答える
2

いいえ、[buttonReset removeFromSuperview];少なくともすぐに を呼び出すべきではありません。呼び出すと、ボタンが画面から消えてしまいます (メソッドの名前を考えると、これは当然のことです)。さらに、ボタンを に設定する必要はありませんnil

removeFromSuperviewコントロールを画面からドロップする必要がある場合は、呼び出しが必要です。それも解放すると、コントロールを表すオブジェクトが破壊されます。たとえば、特定のタスクのためにプログラムでボタンを追加し、タスクが完了したらそのボタンを削除する必要がある場合は、呼び出しremoveFromSuperviewが適切です。

于 2013-04-02T14:42:25.873 に答える
0

ビューを呼び出すremoveFromSuperviewと、スーパービューから削除されます。これにより、対象のビューが画面から消え、そこに含まれるすべてのビューが表示されます。

あなたの状況では、オブジェクトを nil に設定するだけで完了です。

removefromsuperviewは scrollview のオブジェクトを解放しますか? .

その中に興味深い情報があります。

しかし、これは ObjC の非常に重要な概念であるため、さらに深く掘り下げる価値があります。-retain していないオブジェクトに対して -release を明示的または暗黙的に (3 つの魔法の言葉の 1 つを呼び出して) 呼び出してはなりません。オブジェクトの割り当てを解除するために -release を呼び出さないでください。オブジェクトにかけたホールドを解放するために呼び出します。scrollview がサブビューを保持しているかどうかはあなたの仕事ではありません (サブビューは保持されますが、それでもあなたの仕事ではありません)。-removeFromSuperview が -release を呼び出すかどうかも、あなたの仕事ではありません。それはスクロールビューとそのサブビューの間です。重要なのは、オブジェクトを気にかけているときにオブジェクトを保持し、気にしなくなったときにオブジェクトを解放し、システムの残りの部分が気にかけているものの保持と解放を処理することです。

于 2013-04-02T16:24:47.503 に答える
-2

あなただけを使用する必要があります

[buttonReset removeFromSuperview];

その後

buttonReset = nil;

アップルが言うように

レシーバーのスーパービューが nil でない場合、スーパービューはレシーバーを解放します。ビューを再利用する予定がある場合は、このメソッドを呼び出す前にビューを保持し、必要に応じて後で再度解放してください。

in UIView リファレンス

于 2013-04-02T14:41:44.457 に答える