0

私はsetメソッドをやっています:

OBS: somobject はクラスの属性です。

– (void)setSomeObject:(SomeObject *)newSomeobject {

    [何らかのオブジェクトの自動解放];

    someobject = [newSomeobject 保持];

    戻る;

}

[somobject autorelease] で、setSomeObject のスコープの下にあるオブジェクトをこれ以上所有したくないと宣言します。

別のオブジェクトが保持している「何らかのオブジェクト」は解放されますか? または、オブジェクトはsetSomeObjectメソッドで解放されますか?

someobject クラス属性が既に存在する場合は?

このオブジェクトの動作はどうなりますか?

4

3 に答える 3

2

ivar とは異なるように、メソッドのパラメーターの名前を変更します。

– (void)setSomeObject:(SomeObject *)newObject 
{
    [someobject autorelease];

    someobject = [newObject retain];
}

また、メモリ管理については Apple のドキュメントを読む必要が@propertyあり@synthesizeます。

于 2010-03-10T12:33:55.137 に答える
1

同じ名前の 2 つの変数 (メソッド パラメーターとインスタンス変数) があるように見えるという点で、重大な問題があります。コンパイラ(およびこの質問の読者)は、あなたがどちらを参照しているのかわかりません。

メモリ管理の問題については、Apple のプログラミング ガイドを参照してください。

于 2010-03-10T12:21:37.363 に答える
0

セッターで達成する必要があるのは次のとおりです。

  1. 古いオブジェクトを解放する
  2. 新しいオブジェクトを保持する
  3. 新しいオブジェクトをインスタンス変数に割り当てます

もちろん、文字通りその順序で行うと、古いオブジェクトと新しいオブジェクトが同じ場合にオブジェクトをすぐに解放するリスクがあります。ここで「autorelease」が役に立ちます。これは、メソッドが戻った後にのみ、オブジェクトの解放をスケジュールするためです。

メソッド パラメータとインスタンス変数に同じ名前を付けると (IMHO) 紛らわしく、コンパイラの警告が表示されますが、絶対にそのようにすることを主張する場合は、「self->」を使用して、参照していることを指定できます。インスタンス変数:

– (void)setSomeObject:(SomeObject *)someobject {

[self->someobject autorelease];

self->someobject = [someobject retain];

return;

}

最後に、setter メソッドで何か特別なことを行う必要がない限り、@synthesize を使用して、setter/getter を自動的に生成することを検討する必要があります。

于 2010-03-10T12:44:04.587 に答える