1

私は直接ARCを使ってivarを初期化することができますか(ARCなしではうまくいきませんでした。 ?Objective-C - ARCを使ってオブジェクトを割り当て/初期化する

例(このように宣言IVAR考える):

@property (nonatomic, strong) NSArray *myArray; 

@synthetize myArray = _myArray; 

を、あなたのdealloc方法でそれを放出しなかった場合は、その後、それは希望

self.myArray = [[NSArray alloc] initWithObjects:object1, object2, nil]; //I know I could directly use [NSArray arrayWithObjects:...] but that's the purpose of my question 

答えて

3

はい。

alloc/initWithObjects:arrayWithObjects:を使用する唯一の違いは、前者は保持されたオブジェクトを残し、2番目のオブジェクトは保持しないことです。何らかの理由で前者を使用してプロパティを初期化したい場合は、漏れを避けるためにautoreleaseへの呼び出しを追加することをお勧めします。

self.myArray = [[NSArray alloc] initWithObjects:foo, bar, nil]; 
0

を行います。 ARCを使用すると、割り当てを担当します。 deallocメソッドでは、ARCを使用しても、self.ivar=nilを使用してリソースを解放できますが、ARCはそれを自動的に実行していますが、単語releaseを明示的に使用していません。また、ARCでは[super dealloc]に電話することはできません。

-1

あなたはまだすることができ:あなたが今だけ言うことができるように

self.myArray = [[[NSArray alloc] initWithObjects:foo, bar, nil] autorelease]; 

あなたは、ARCと、コンパイラはあなたのためにそれを追加するの世話をすることが正しいです:だから、これを行うと思います割り当てと保持。オブジェクトライフサイクルは同じままです。つまり、オブジェクト数が0になったときにオブジェクトが解放されます。ARCが行うことは、オブジェクトを自動解放プールに配置し、完了したはずのオブジェクトを正しく解放することです。 deallocをオーバーライドすることはできます。

ARCについての良い記事を見つけるhere

+1

これは間違っています。もちろん、ARCコードで 'alloc'を使うことはできますが、' retain'や 'release'や' autorelease'を使うことはできません。また、ARCは自動解放プールにすべてを配置するだけではありません。コードを分析して各参照の有効期間を判断し、メモリ管理メソッドへの適切な呼び出しを挿入します。 – Caleb

+0

はretainを使用できないことに同意しますが、ライフサイクルは同じままであると言いました。 2行目と3行目を読む – zahreelay

+0

はい、最初に書きました。「引き続き割り当てることができます。」 1行目を読む。私が指摘したように、「すべてのARCは...」という文章は誤解を招くほどのものです。 – Caleb

関連する問題