2012-06-14 10 views
8

Big Nerd Ranch iOS 5の書籍(p.73)とプログラミングiOS 5の本(O'Reilly、p.314)(updadte:コカンのObjective-C本の第4版でさえ)は、 ARCの属性属性のデフォルトはassignだと言いますが、Apple's documentationはデフォルトがstrongだと言います。Objective-CではARCを使用していますが、通常は非属性をプロパティ属性として指定するだけでよいのですか?

また、私はstrongを指定しない場合、プログラムがうまく動作し、私はstrongを指定した場合、それは同じように動作し、assignが代わりに使用されている場合、コンパイラは警告を示し、それ簡単なプログラムを試してみましたデフォルトは実際にstrongと思われます。

だから、ほとんどの時間は、我々は

@property (nonatomic, readwrite, strong) NSMutableArray *foo; 

をしたいならば、私たちは、他の2つ(readwritestrong)など

@property (nonatomic) NSMutableArray *foo; 

を書くことができ、デフォルトはありますか?

+0

割り当ては、ARCなしでのみ使用されるため、コンパイラの警告が表示されます。 – Darren

+0

しかし、警告はARCで 'assign'を使うことに関するものではありません。それはオブジェクトが通常予想よりも早くリリースされることについてです –

+0

'assign'はARCの' unsafe_unretained'と同じです。言い換えれば、MRCの下のassignと同じ振る舞いです。 –

答えて

12

readwriteとstrongは、本当にARC *のデフォルトです。手動参照カウントでは、assignが(デフォルト)でした。私はこれらを明示的に指定する方が好きです。なぜなら、デフォルトのものを知っている人に頼るのではなく、@プロパティのパラメータが何であるかを明確にするからです。

*強力なのは、コンパイラにインスタンス変数を合成させるか、明示的な所有者修飾子なしでインスタンス変数を宣言していることを前提としています(デフォルトでは、ivarは__strongです)。それ以外の場合、デフォルトの所有権タイプは、ivarの宣言の所有者修飾子と一致します。したがって、明示的に__weakのivarを宣言し、所有者修飾子なしで@propertyを宣言すると、合成されたプロパティは弱くなります。これはすべてClang ARC documentationに記載されています。

+0

それは本当です...もし他の人がコードを読んでいるのであれば、あなたは単に「非原子的で強い」と指定しますか? –

+0

ところで...コカンのObjective-Cの本でさえ、デフォルトが '強い'ではないと言われています...だから、最近何かが変わったかもしれません... –

+0

私の答えで述べたように、ARCではデフォルトが強いです。 assignは手動メモリ管理(つまりARC以外)のデフォルトであるため、ARCが導入されたときに新しいコードに対してデフォルトが効果的に変更されました。私は_always_明示的にプロパティを宣言するときの所有権を指定します。 –

関連する問題