0

Objective-C でのメモリ管理の理解が深まりつつありますが、理解できないことがあります。これはプロパティ宣言です:

@property (nonatomic, retain)UILabel *myLabel;

そして、これは目に見えない合成セッターです(私は思います):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}

これにより、毎回保持などのすべての作業を節約できますが、初めてプロパティを設定したとします。まだ割り当てられていないため、参照カウントは 0 ですよね? 私もです

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];

何もリリースしない場合に何が起こるかはよくわかりませんが、プロパティには既に値があり、それを設定するとします。セッターでは、まず解放されます。それで消えるんじゃないの?参照カウントが 1 で、セッターで解放された場合、保持された新しい値に設定されるためにどのように留まりますか?

ありがとう!!

4

3 に答える 3

6

オブジェクトと参照を混同していると思います。プロパティは、オブジェクト自体ではなく、オブジェクトへの参照です。プロパティを設定または設定解除すると、それが指すオブジェクトに保持および解放が送信されますが、参照自体はプロパティが含まれるオブジェクトの一部です (この場合は自己)。

ポインター左辺値などについて読むと役立つ場合があります。

于 2009-07-31T14:55:13.927 に答える
0

myLabel の初期値は nil なので、プロパティへの最初の代入、つまり

self.myLabel = tempLabel;

nil を解放します。つまり [nil release] です。Objective C では、nil へのメッセージの送信はノーオペレーションであるため、これは何もしません。

同様に、dealloc メソッドには、次のものが必要です。

[myLabel release];

プロパティが割り当てられている場合は myLabel を解放し、セッターの [newValue 保持] のバランスをとります。プロパティが割り当てられていない場合、それはまだ nil であり、再び [nil release] はノーオペレーションになります。

オブジェクトを保持/解放する必要がある場合の正確なルールについては、メモリ管理ルールをお読みください。

オブジェクトのすべての所有権が放棄されると、そのオブジェクトは「消える」(つまり、割り当てが解除される) ことになります。つまり、すべての alloc/copy/new 呼び出しが release/autorelease 呼び出しとバランスが取れたとき (またはその直後) です。

于 2009-08-01T02:39:00.230 に答える
-2

私はObjective-Cにも比較的慣れていませんが、これに答えて私の理解を再確認したいと思います。

初めてプロパティを設定したとしますが、まだ割り当てられていないため、参照カウントは 0 ですよね?

はい、保持カウントは 0 です。

セッターでは、まず解放されます。それで消えるんじゃないの?

の保持カウントから 1 を減算しますmyLabel。myLabel の保持カウントが 0 に達すると、myLabel変数が指しているデータまたはオブジェクトがメモリから解放されます。

参照カウントが 1 で、セッターで解放された場合、保持された新しい値に設定されるためにどのように留まりますか?

そのシナリオでは、myLabel指しているデータは解放され (保持カウントは 0 になります)、myLabelnil を指します (空です)。変数はクラスで設定され、そのセッターへのメッセージを受け入れるために常に使用できるため、新しいデータをの保持カウントが 0 か 100myLabelかにかかわらず割り当てることができます。myLabel

于 2009-07-31T14:55:20.683 に答える