2011-12-12 21 views
1

私は間違いについて(dumb question)先日ダム質問を:それはばかな質問だったと私は時間に私のミスをキャッチしていない初期化オブジェクト/ ARC

// line1 
NSMutableData* myData = [NSMutableData data]; 
// line2 
NSMutableData* myData = [[NSMutableData alloc] init]; 

。これは簡単にまだばかな質問かもしれ

// line1 -- added retain 
NSMutableData* myData = [[NSMutableData data] retain]; // added retain 
// line2 
NSMutableData* myData = [[NSMutableData alloc] init]; 

...謝罪その場合は:私が尋ねることを意図して、違いは何です!本当の違いはありますか? ARCとは?私はNSXMLParserの例で両方のメソッドを使用しているのを見ました(いくつかのAppleの例では[[[NSMutableData alloc] init] autoreleaseを使用します))、実際に違いがあるかどうかはわかりません。

+1

コンパイラでは、ARCで 'release'を使用できません。 – dasblinkenlight

+0

[[[NSDate date \] retain \]と\ [\ NSDate alloc \] init \]の差異]の複製(http://stackoverflow.com/questions/7102706/difference-between-nsdate-date -retain-and-nsdate-alloc-init) –

+1

@JoshCaswell:当時ARCは存在していませんでした。この質問者は、特にARCの違いについて質問しています。それは答えを変えます:ARCでは、違いは1つが無効であるということです。 –

答えて

7

retainは、ARCコンパイルコードでは呼び出せません。

質問に答えるには、非ARC環境では、これらは事実上同じです。

[NSMutableData data]は、オートレリースされたオブジェクトを返します。それにはretainを呼び出して所有権を取得しており、ある時点でそれを解放する必要があります。

[[NSMutableData alloc] init]は、保持カウントが1に等しいオブジェクトを返します。したがって、所有者であり、終了したときにそれを解放する責任があります。

また、retainはARCコンパイル済みコードでは使用できませんので、NSMutableData* myData = [[NSMutableData data] retain];はコンパイルされません。

さらに明確にするために、ARCを使用している場合は、次のいずれかの行を使用して安全で、オブジェクトの保持方法や解放方法について心配する必要はありません。

// line1 
NSMutableData* myData = [NSMutableData data]; 
// line2 
NSMutableData* myData = [[NSMutableData alloc] init]; 

編集

また、[[[NSMutableData data] retain] autorelease]このコードはかなり無意味と過大です。それは "私に自動リリースされたNSMutableDataオブジェクトをクラスメソッドdataを使用して与え、私のためにこの自動リリースされたオブジェクトを保持して、私は現在自動リリースプールに戻ってこのオブジェクトを追加します。したがって本質的に[NSMutableData data]は、少ないコードと少ないオーバーヘッドで同じ結果を達成します。あなたがAppleの例でこのような行を本当に見たなら、私は驚くだろう。

+0

申し訳ありませんが、間違っているコードを貼り付けても間違いありません。アップルの例は適切なalloc-init-autoreleaseを行います。データは保持されません。私は私の質問を更新します。 – Raolin

+0

Chrisが正しいです。さらに、[NSMutableData new]も使用できますが[[NSMutableData alloc] init]と同じです。 – NadavN7

関連する問題