リリースされたオブジェクトにメッセージを送信しますか?

私はいくつかのUIViewサブクラス(ボタン、ラベルなど)を次の設定パターンに従っています。私の質問は、なぜ release の後でも UILabel にメッセージを送ることができるのですか?

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

     myLabel.textAlignment = UITextAlignmentCenter;

    //other property changes to myLabel

それらは新しいUIViewによって「所有」されていると思いますが、 release が元のオブジェクトを破棄してすべてのメッセージを破棄しない理由を理解できません。私は someUIView subView でプロパティを変更するつもりはありません。私は不平を言っていません。私は理由を理解しようとしています。

EDIT:これらがインスタンス変数である場合は、それを変更する必要があります。

1

4 答え

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

オブジェクトを解放した後にオブジェクトにアクセスしないのが最善です。より良いパターンは次のようになります。

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

2番目の例:

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

// other property changes to myLabel

[myLabel release];
myLabel = nil;
3
追加された
リリース後にプロパティの変更があるのは、クラス内の他のメソッドが変更しているためです。ある時点で別のメソッドがそのプロパティを変更している可能性がある場合は、どこにリリースする必要があるかわかりませんでした。
追加された 著者 Old McStopher,
次に、 textAlignment の設定後に解放します.2番目の例を参照してください。提案 "ARCを使用すると、すべての保持と解放が処理されます。
追加された 著者 zaph,
myLabel がインスタンス変数で、クラス内の他のメソッドが myLabel を変更している場合は、変更するたびに既存の値を解放してから新しい値を割り当てる必要があります。しかし、これは本当に起こっている場合、これは非常に壊れやすいと思う、たとえば、 textAlignment が一貫していることを確認しますか?
追加された 著者 bbum,

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

1
追加された

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

1
追加された
完璧!ありがとう!他のメソッドが暗黙的に呼び出しを呼び出すとき、どうすればわかりますか?私が知っておくべきリストがありますか? (NSObjectのretainCountを見る以外は)
追加された 著者 Old McStopher,
ありがとう、マーク。あなたは@CocoaFuへの私の反応を詳述できますか?
追加された 著者 Old McStopher,
オブジェクトを解放した後は使用しないでください。
追加された 著者 zaph,
この答えは間違っています。オブジェクトを解放したら、そのオブジェクトへの参照を再度使用しないでください。この場合、それは偶然によってのみ機能します。偶然、-addSubview:それを保持することが起こります。 myLabel がローカル変数であると仮定して、最後の使用後にリリースを移動します。スタティック・アナライザはこのコードについて文句を言う必要があります(正しく言えばそうです)。
追加された 著者 bbum,
短い答えは...心配しないでください。もちろん、私は -addSubview:がオブジェクトの保持を実行することを知っていますが、必要ではありません。 retainCount に関しては、気にしないでください。真剣に。それは狂気につながる実装の詳細です。
追加された 著者 Mark Adams,
私はそれが正しいとは言わなかった。私はちょうどそれが働いたことが起こった理由を説明していた。
追加された 著者 Mark Adams,

彼らはおそらく前に保持されているので...

0
追加された
それは私が思ったことですが、それ以上の点検では、私は明白な事前の保持を見ません。
追加された 著者 Old McStopher,