18

次のスニペットをかなり見ました。

ヘッダー内:

SomeClass *bla;
@property(nonatomic,retain) SomeClass *bla;

実装ファイル内:

@synthesize bla;

その後

self.bla = [[SomeClass alloc] init];

この割り当てにより、「bla」の保持カウントが 2 つ増えると思います。1 回 alloc/init 呼び出しを介して、次に、合成されたプロパティ セッターを介して発生するように要求した保持を介して。

その結果、通常、次のようにプロパティを宣言します。

ヘッダー内:

SomeClass *_bla; // note the underscore
@property(nonatomic,retain) SomeClass *bla;

実装ファイル内:

@synthesize bla = _bla;

その後

_bla = [[SomeClass alloc] init];

私の最初の仮定が正しければ、これを行うための「正しい」方法、つまりプロパティの宣言、初期化、およびメモリ管理があるかどうかを知りたいです。

4

4 に答える 4

9

はい、その通りです。プロパティの合成セッターを使用すると、retain既に所有しているインスタンスの参照カウントが増加します (alloc所有権を意味するため)。

イニシャライザで言及した2番目のフォームを使用してください:

_bla = [[SomeClass alloc] init];

...それ以外の場合は保持カウントを修正することを忘れないでください。

self.bla = [[[SomeClass alloc] init] autorelease];
于 2010-07-16T06:58:39.050 に答える
9

この割り当てにより、「bla」の保持カウントが 2 つ増えると思います。

真実。

これを行う「正しい」方法があるかどうかを知りたいです

コードの最後の部分は正しい方法ですが、先頭のアンダースコアはお勧めしません。プロパティと ivar は同じ名前を共有できます。ただ

@interface Foo : Bar {
  SomeClass* bla;
}
@property (nonatomic, retain) SomeClass* bla;
@end

@implementation Foo
@synthesize bla;
-(id)init {
   ...
   bla = [[SomeClass alloc] init];
   ...
}
-(void)dealloc {
  [bla release];
  ...
  [super dealloc];
}

で十分です。


使う人もいるかもしれません

SomeClass* foo = [[SomeClass alloc] init];
self.bla = foo;
[foo release];

また

self.bla = [[[SomeClass alloc] init] autorelease];

-initただし、これは不必要に多くのメソッドを呼び出し、 setter の動作を保証できないため、強く勧めしません。

于 2010-07-16T06:59:31.773 に答える
3

ここでの中心的な問題は、Cocoaのオブジェクト所有権のセマンティクスの誤解であるように見えます。ごとinitに、copyまたはretainオブジェクトで呼び出されるたびに、releaseまたはを呼び出すautorelease必要があります。ここで起こっていることは、への呼び出しにまたはinitへの一致する呼び出しがないということです。releaseautorelease

ここで紛らわしいのは、プロパティ代入のドット表記がメソッド呼び出しの構文糖衣であるということです。したがって、実際にはプロパティセッターへの呼び出しであるのに、それは単なる割り当てのように見えます。

self.bla = [[SomeClass alloc] init];

と同じものではありません:

bla = [[SomeClass alloc] init];

前者は次のように解釈されます。

[self setBla: [[SomeClass] alloc] init]];

後者は文字通り割り当てです。

問題を修正するために本当に必要なのは、呼び出しを呼び出すコードがinit、セッターによる呼び出しのautorelease後に保持カウントが減少するようにすることだけです。retain

于 2010-07-17T06:15:30.037 に答える
-3

ダブルカウントはありません。synthesize によって作成されたセッターは、保持を行う前に解放を行います。Apple Web サイトで参照されているように、客観的な c クラス 3 に関するスタンフォード クラスを参照してください。また、ioutlets の場合、xib ファイルのロードによって実行されるため、alloc init は必要ないことにも注意してください。

于 2011-05-08T05:40:55.123 に答える