0

次のコードを参照してください。

- (void) setSomeThing:(NSString *) someThingNew
{
     if(someThing!=someThingNew)
     {
         [someThingNew retain];
         [someThing release];
         someThing = someThingNew;
     }
 }

 ... ...
 - (void) dealloc
 {
     [someThing release];
     [super dealloc];
 }
@end

setter のパラメータはsomeThingNewsetterretainメソッドにありました。つまり、その保持カウントは 1 です。

ここで質問:someThingNewすべきreleaseですか?

それとも同じオブジェクトを指しsomeThingているからで、メソッド内でそう指しているのですか?someThingNewdeallocsomeThingreleasesomeThingNewnil

4

3 に答える 3

1

someThingNew はリリースする必要がありますか?

いいえ、今someThingsomeThingNew同じアドレスを指しているためです。someThingdealloc で解放する (そして、安全のために nil 化しますが、それは別の質問です) ことで、セッターでの保持のバランスをとります。すべてうまくいきます! *

*補足: のインスタンスNSStringは通常、settercopyでは d ではなく 'd でretainあるため、誤って渡しても問題ありませんNSMutableString

于 2013-03-05T13:55:18.667 に答える
0

setter メソッドが呼び出されるたびに、someThingNew が保持され、someThing が解放されます。次に、someThingNew の新しいアドレスが someThing に格納され、保持カウントが 1 になります。

これは、オブジェクト自体の割り当てが解除されるまで、クラスにとどまります。dealloc が呼び出されると、someThingNew のポインターが解放され、保持カウントが 0 になります。

于 2013-03-05T13:44:57.243 に答える
0

コードは正しいです。「強い」変数にしたい場合、セッターはオブジェクトを保持する必要があります。しかし、それを解放する必要はありません。セッターの責任範囲ではありません。したがって、セッターを呼び出すコードでは、次のようになります。

  • 割り当てるオブジェクトを割り当てます。
  • セッターを呼び出します。
  • 必要がなくなったら解放してください。

ポリモーフィズムが有効であるため、ポインターは変更可能な文字列オブジェクトを指している可能性があるため、文字列は通常コピーされるという事実を除いて、うまくやっています。

例:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
NSString* newString= [[NSMutableString alloc]initWithString: @"Hello"]; // Retain count 1.
[newString autorelease]; // Still 1 as retain count, but it will be decreased
                         // when the pool will be drained.
[object setSomeThing: newString];  // Retain count 2.
[pool drain]; // Retain count 1

この例では、オブジェクトを保持する代わりにコピーする必要がある理由が明確にわかります。オブジェクトは変更可能な文字列であるため、いつでも変更できます。

オブジェクトのコピー

オブジェクトをコピーすると、メソッドの呼び出し方法 (上記のコード) は変更されず、メソッドの実装が変更されるだけです。このようなもの:

- (void) setSomeThing:(NSString *) someThingNew
{
     if(someThing!=someThingNew)
     {
         [someThing release];   // Retain count decreased by 1.
         someThing = [someThingNew copy];  // Retain count 1.
     }
 }

 ... ...
 - (void) dealloc
 {
     [someThing release];
     [super dealloc];
 }
@end
于 2013-03-05T14:38:55.117 に答える