プロパティを使用したメモリ管理
-
06-07-2019 - |
質問
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で、セッターでリリースされた場合、保持された新しい値に設定するためにどのように残りますか?
ありがとう!!
他のヒント
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。