どちらの方法が正しいですか?プロパティでメモリを割り当てる正しい方法はどちらですか?
NSString *c = [[NSString alloc] init];
self.character = c;
[c release];
または
self.character = [[NSString alloc] init];
そして、なぜ?ありがとう。
どちらの方法が正しいですか?プロパティでメモリを割り当てる正しい方法はどちらですか?
NSString *c = [[NSString alloc] init];
self.character = c;
[c release];
または
self.character = [[NSString alloc] init];
そして、なぜ?ありがとう。
あなたのプロパティの宣言方法によって異なります。使用した場合
@property (nonatomic, retain) NSString *someString;
setStringはsomeStringを保持するために作成されます。この場合、正しい方法が最初の方法です。
@property (nonatomic, assign) NSString *someString;
2番目の方法では、ポインタを割り当てて何も保持しないので、正しい方法です。
答えは@property
の定義によって異なります。おそらく、の場合は(retain)
または(copy)
のようなものでしょう。その場合、self.characterに代入すると、保持カウントがインクリメントされます。だから、一番下:
self.character = [[NSString alloc] init];
は、あなたはそれが漏れますのでアロケーションとself.characterで1に、カウントを保持はまた、2のカウントのためにそれを保持します設定しました。
self.character = [[[NSString alloc] init] autorelease];
またはトップバージョンである必要があります。
あなたのプロパティをどのように定義したかによって異なります。
copy
またはretain
の場合、合成された設定者(例ではsetCharacter:
)は、プロパティに割り当てたオブジェクトの所有権を取得します。この状況では、最初の例が正しいです。 2回目はNSString
の所有権を2回要求しているのでメモリリークにつながります(おそらく)所有権を一度だけ放棄します。したがって、メモリは再利用することはできません。
一方、assign
の場合、セッターは特別なことを行わず、2番目の例は正しいでしょう。 NSString
で何かをしようとすると、最初にEXC_BAD_ACCESS
エラーが発生します。私はあなたが一般的にプリミティブ型と代理人のためにassign
を使用することに注意する必要があります。
「Objective-Cプログラミング言語ガイド」のMemory Management Programming GuideとDeclared Propertiesのセクションを読んでください。
iOS 5のこれに対する答えは、ARCを使用することです。