質問

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で、セッターでリリースされた場合、保持された新しい値に設定するためにどのように残りますか?

ありがとう!!

役に立ちましたか?

解決

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

ポインター左辺値

他のヒント

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

self.myLabel = tempLabel;

nilがリリースされます。つまり、[nil release]です。 Objective Cでは、nilにメッセージを送信しても操作は行われないため、何も実行されません。

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

[myLabel release];

プロパティが割り当てられている場合はmyLabelを解放し、セッターの[newValue retain]を調整します。プロパティが一度も割り当てられていない場合、nilのままになり、再び[nil release]はノーオペレーションになります。

メモリ管理ルールを読むオブジェクトを保持/解放する必要がある場合の正確なルール。

オブジェクトは「消失」します; (つまり、割り当てを解除する)その上のすべての所有権が放棄されたとき。つまり、すべてのalloc / copy / new呼び出しがrelease / autorelease呼び出しと平衡化されたとき(またはその直後)。

Objective-Cも比較的初心者ですが、これに答えて理解を再確認したいと思います。

  

最初にプロパティを設定したが、まだ割り当てられていないので、参照カウントが0であると言いますか?

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

  

セッターでは、最初にリリースされます。だからそれは消えないのではないでしょうか?

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

  

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top