ARCでの@property定義:強いか保持するか?


80

Xcode 4.2とARCを使用すると、自動生成されたコードNSManagedObjectがプロパティに対して次のようになります。

@property (nonatomic, retain) NSString * someString;

1)またはretainに置き換える必要はありませんstrongweak

2)自動生成されたコードがまだ使用されているのはなぜですか retain

3)retainこのプロパティステートメントの正しい置換は何ですか?

現在、を使用して問題をデバッグしていNSFetchRequestますが、これが問題の原因である可能性があると思いました。考え?


あなたは今までに答えを受け入れるべきです。
リベラ

回答:


110

1)今保持するべきではありません強いまたは弱いと交換してください?

いいえ。保持を弱いものに置き換えることはできません。彼らは異なっている。そしてstrongはretainの100%同義語です。それらは同一です。どちらも使用できるので、ここに「すべき」はありません。必要に応じて、retainをstrongに置き換えることができますが、そうする必要はありません。

2)自動生成されたコードがまだretainを使用するのはなぜですか

何故なの?(1)を参照してください。保持は正しいので問題ありません。

3)このプロパティステートメントのretainの正しい置換は何ですか?

保持を交換する必要はありません。

現在、NSFetchRequestを使用して問題をデバッグしていますが、これが問題の原因である可能性があると思いました。考え?

そうではありません。


9
しかし、標準とApple Wayへの準拠に夢中になっている(そして当然のことながら!)コミュニティにとって、合成されたモデルだけで保持を見るのは標準以下だと思います。衒学者になるためだけに強いに変わります。1つは、不適切な構文のために大規模なプロジェクトを確認するのが少し簡単になることです。
エリックゴールドバーグ2011

12
感情的なアーキテクチャが何であるか正確にはわかりません。「冷たく澄んだ日の光」の例を挙げていただけますか?;-) falseとNOは同義語ですが、Objective-Cでは慣例によりNOを使用します。一貫している理由があります。一貫性がないことは問題ありませんが、価値を証明する責任は、それを遵守するものではなく、1つの違反する慣習にあります。
エリックゴールドバーグ2011

9
敬意を払って、@ EricGoldbergには重要な点があります。それは、慣習が重要なことです。また__strong、コード内の他の場所に移動するため(ありません__retainstrong、一貫性を保つために使用に切り替えることをお勧めします。これは、コードがこれなしで正常に実行される場合でも、一貫した方法でコードをインデントすることに似ています。
ダンローゼンスターク2011

3
@matt:私の元のコメント、つまり私が「感情的に」コーディングしていると非難したコメントを見ると、私が「ポジット」と「ただの衒学者」という言葉を使用していることがわかります。私は実際、「ある」ではなく「すべき」を提案しています。
エリックゴールドバーグ2011

1
すべてのプログラミングはイディオムに関するものです。他に問題はありません。すべてのプログラミングは同義語であり、プログラミングのエンジニアリングプラクティス全体は、クライアントのコードに価値を付加するために、現在のイディオムを使用することです。
Fattie 2014年

40

3つの質問すべてに1つで答えるには:retainstrongは互いに同義であるため、両方とも正しいです。ドキュメントには次のように記載されています

retain__strong所有権を意味します

strong__strong所有権を意味します


返信ありがとうございます。私はARCでAppleのドキュメントを読みました。私は、保持が強いことを意味することを理解しています。ただし、これは、新しいNSManagedObject(s)の作成時にXcodeによって自動的に生成されるコードが@property(非アトミック、保持)を提供する理由を説明していません
one09jason 2011年

3
私がここで何かを逃していない限り、それはそれを完全に説明します。保持は同じように強力に機能するため、Xcodeが作成するコードは正しいので、質問はどこにありますか?
Phlibbo 2011年

6
あなたのプロジェクトにARCのリファクタリングを実行した場合、それはすべてのものを変換するretainに秒をstrong秒。ですから、私の印象では、それstrongが優先属性ですが、NSManagedObjectジェネレーターは更新されていません。しかし、それは単なる推測です。たぶん、Appleの誰もその区別が重要だとは考えていません。
理論

4

ARCの前に、保持されているオブジェクトを「解放」する必要があります。つまり、保持には対応する部分があります。ARCの後、リリースする必要はありません。だから強く使う。リリースを呼び出す必要がないという視覚的な手がかりです。


3

「保持」は「強い」と同じです。

「強い」は次に使用されます:

@property (nonatomic, strong) NSString * someString;

また、「__ strong」は次のように使用されます。

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

AppleDocsについて。言う:

プロパティ属性

次の例に示すように、キーワードweakおよびstrongは、新しく宣言されたプロパティ属性として導入されます。

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Appleドキュメント。http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.