2011-12-19 14 views
1

私はいくつかのUIViewサブクラス(ボタン、ラベルなど)を以下の設定パターンに従います。私の質問は、releaseの後にメッセージがまだUILabelに送信できるのはなぜですか?彼らは新しいUIViewのが「所有」しているリリースされたオブジェクトにメッセージを送信しますか?

myLabel = [[UILabel alloc] initWithFrame:someFrame]; 
    [someUIView addSubview:myLabel]; 
    [myLabel release]; 

    myLabel.textAlignment = UITextAlignmentCenter; 

    // other property changes to myLabel 

、私は考えますが、releaseがそれに元のオブジェクトとすることにより、すべてのメッセージを破壊しない理由を私は理解していません。私はsomeUIViewsubViewsを通して財産の変更をしていません。私は不平を言っていません。私は理由を理解しようとしています。

EDIT:私は、これらがインスタンス変数であり、違いがある場合は追加する必要があります。ラベルはまだ発売されていなかったので、彼らはおそらく以前に保持されているので

答えて

1

あなたはまだラベルにメッセージを送ることができます。 -addSubview:は、渡されたオブジェクトを保持しています。そのため、ビューにはまだ参照が保持されていて、ポインタはmyLabelポインタを保持していないため、オブジェクトはメモリ内に残ります。

+0

完璧!ありがとう!他のメソッドが暗黙的に呼び出しを呼び出すとき、どうすればわかりますか?私が知っておくべきリストがありますか? (NSObjectのretainCountを見ている以外は) –

+1

オブジェクトを解放した後、それを使用しないでください。 – zaph

+2

短い答えは...心配しないでください。確かに、私は '-addSubview:'がオブジェクトに対してretainを実行することを知っていますが、必ずしも必要ではありません。 'retainCount'に関しては、気にしないでください。真剣に。それは狂気につながる実装の詳細です。 –

0

...

+0

:より良いパターンかもしれません:

myLabel = [[[UILabel alloc] initWithFrame:someFrame] autorelease]; myLabel.textAlignment = UITextAlignmentCenter; [someUIView addSubview:myLabel]; myLabel = nil; 

第二の例。 –

1

-addSubview:へのお電話は、ラベルを受け取ったときにラベルの-retainを呼び出します。この時点で所有権を放棄(-release)し、ビューのみ所有権を放棄します。しかし、それを保持するビューもそれをリリースするまではまだ存在します。

3

保持カウントが0より大きい限り、オブジェクトは破棄されません。この場合、someUIViewはオブジェクトを保持しています。

実際にオブジェクトを解放した後は、オブジェクトにアクセスしないことをお勧めします。私が考えたものだが、さらに検査時に、私は明白な前保持していない参照

myLabel = [[UILabel alloc] initWithFrame:someFrame]; 
[someUIView addSubview:myLabel]; 
myLabel.textAlignment = UITextAlignmentCenter; 

// other property changes to myLabel 

[myLabel release]; 
myLabel = nil; 
+0

リリース後にプロパティの変更があるのは、クラスの他のメソッドが変更しているためです。ある時点で別のメソッドがそのプロパティを変更している可能性がある場合は、どこにリリースする必要があるかわかりませんでした。 –

+0

その後、 'textAlignment'を設定した後に解放します。私の2番目の例を参照してください。提案する "ARCを使用すると、すべての保持と解放が処理されます。 – zaph

+0

' myLabel'がインスタンス変数で、クラスの他のメソッドが 'myLabel'を変更している可能性がある場合、すべての変更はまず既存の値を解放し、新たに割り当てます。しかし、これは本当に起こっている場合、これは非常に壊れやすいと思う、例えば、 'textAlignment'が一貫していることを確認しますか? – bbum

関連する問題