4

次のコードを考えると

@interface MyClass
{
   SomeObject* o;
}

@property (nonatomic, retain) SomeObject* o;

@implementation MyClass
@synthesize o;

- (id)initWithSomeObject:(SomeObject*)s
{
   if (self = [super init])
   {
      o = [s retain]; // WHAT DOES THIS DO? Double retain??
   }
   return self
}

@end
4

1 に答える 1

12

二重保持ではありません。s一度だけ保持されます。

その理由は、イニシャライザ内で合成セッター メソッドを呼び出していないためです。この行:

o = [s retain];

保持し、等しいようにs設定します。つまり、同じオブジェクトを指します。合成されたアクセサーは呼び出されません。と行を完全に取り除くことができます。osos@property@synthesize

その行が次の場合:

self.o = [s retain];

または同等に

[self setO:[s retain]];

次に、合成されたアクセサーが呼び出され、2 回目の値が保持されます。一般に、イニシャライザ内でアクセサを使用することは推奨されないことに注意してください。関数o = [s retain];をコーディングするときのより一般的な使用方法です。init

于 2010-02-12T23:55:43.017 に答える