2009-07-31 8 views
0

私は客観的にメモリ管理をよく理解し始めていますが、理解できないことがあります。これは、プロパティの宣言です:プロパティを使ったメモリ管理

@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で、setterで解放された場合、保持されている新しい値にどのように設定されますか?

ありがとうございます!

答えて

6

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

pointerslvaluesのようなものを読み上げると便利かもしれません。

+0

ありがとうございます。 – mk12

-2

私はObjective-Cについても比較的新しいですが、私の理解を再確認するためにこれに答えようとします。

私のプロパティを初めて設定した場合、そのプロパティはまだ割り当てられていないため、参照カウントは0です。

はい、保持カウントは最初それがリリースされる、セッターは0

です。それはそれを消えさせないのですか?

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

参照カウントが1で、設定されたセッターでは、保持されている新しい値にどのように設定されますか?そのシナリオで

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

+0

技術的には、絶対保持件数について考えるのではなく、オブジェクトの所有権があるかどうかを考えることが最善です。オブジェクトの保持カウントが0に達すると、オブジェクトは保持されません。オートレリースされたオブジェクト(保持カウントが1で、後で0になる可能性があります)は、最初のポイントで説明しているものとは異なります。そして、ルイスが指摘しているように、ivars(変数/参照)には保持カウントがありません。 –

+0

あなたはこの質問にコメントとして、または新しい質問として投稿する必要があります。 – Quentamia

0

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

self.myLabel = tempLabel; 

は、nil、すなわち[nil release]をリリースします。Objective Cでは、メッセージをnilに送るのはノーオペレーションなので、何もしません。

同様に、あなたのdeallocメソッドでは、あなたが持っている必要があります。

プロパティが今までセッターで[newValueが保持]釣り合う、割り当てられている場合、mylabelというをリリースする予定

。プロパティが一度も割り当てられていない場合、それはまだnilであり、再び[nil release]はノーオペレーションになります。

オブジェクトを保持/解放する必要がある場合の正確な規則については、memory management rulesを参照してください。

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