2012-02-13 22 views
3

プロジェクトはiOS5のみで、ARCが有効になっているプロジェクトはXcode 4.3.1ベータ版でコンパイルされます。 4.2.1でコンパイルするとき。 LLVMは、このような警告を投げている:Xcode 4.2.1 ARCの問題

だから、プロパティ定義

を次のようになり、「ARCは 未指定の所有権やストレージ属性を持つObjective-Cのオブジェクトのプロパティを合成することは禁じ」:

@property (nonatomic) NSObject* object 

ARCはビルド設定で有効になっています。強い属性を追加するとこの警告が修正されますが、これはのデフォルトのになるはずです。

これらのプロパティの既定値を処理する際にXcodeのバージョンに違いはありますか?

おかげ アンディ

+0

Xcode 4.3がリリースされました。したがって、プロパティ定義にはストレージ属性は必要ありません。 Strongはデフォルトであり、以下は問題なく動作します。 '@property(非原子性)NSObject *オブジェクト' – abs

答えて

4

これはベータ特定のXcode 4.2.1ではありません(ベータ版がNDAの下で、唯一の合法的にAppleの開発者向けフォーラムで議論する必要がある)と同じ動作を持っています

強いがデフォルトの設定ですivarの場合。あなたが__unsafe_unretainedまたは__weakを必要とする場合は、ivarsの場合は指定する必要があります。

プロパティ宣言で属性を指定することが常にベストプラクティスです。 copy属性が、私はラベルへNSMutableStringの参照を渡すことができ、それはコピーを作成し、私ができると言われます。この例では

@property(nonatomic,copy) NSString *text; // default is nil 

:心に最も早くポップ一つの例は以下のように定義UILabelプロパティのテキストであり、文字列を変更すると、ラベルは同じままになります。その行動ははっきりと定義されている。

これは明らかに定義された動作であり、ARCコンパイラがストレージ属性を指定することが最も顕著な理由でした。新しいランタイムでは、プロパティのためにivarsを宣言する必要がなくなり、アクセサーメソッドのために@synthesizeが必要になることを覚えておいてください。間違いなくデリゲートを保持していた場合にプロパティ宣言だけが注目されます。

また、プロジェクト内のいくつかのクラスが内部実装がARCに対して完全に不透明である場合、ARCから除外されている可能性があることも考慮してください。

関連する問題