私は一般的にiOS開発に不慣れで、手動の参照カウント(保持、リリース、自動解放)を扱ったことはありません。そのため、魔法の ARC が何を行っているのかよくわかりません。
次のようなオブジェクトを指す読み取り専用プロパティにどのタイプの所有権 ( weak
、strong
、など) を付与する必要があるかを尋ねられるまで、私は理解していると思っていました。assign
@property (readonly,nonatomic) NSString* name;
ここで読んだ
ARC の読み取り専用の @property に関する質問でstrong
、 /をオフにすると、プロパティのweak
ときにバッキング変数を指定しない限り、実際にはコンパイルされません。@synthesize
たまたま、次のようにバッキング ivar を指定していました。
@synthesize name = _name;
ここから、変数のデフォルトの「ライフタイム修飾子」が強力であることを理解しました:http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref /doc/uid/TP40011226-CH1-SW4
つまり、簡単に言えば(readonly,nonatomic,strong)
、_name
ivar が暗黙的に として宣言されているため、間接的に自分のプロパティを として定義しています__strong
。
いくつかの質問を聞きたいんです:
strong
使用する正しい有効期間修飾子はありますか? そうでないと、オブジェクトのバッキングはNSString*
どこにも所有されず、自動的に解放されます (Java ランドから来ると、デフォルトですべての参照が強いため、これは理にかなっています)。またはなど、この状況で意味のある他の修飾子はあります
copy
かassign
?プロパティを次のように宣言すると、プロパティ
(readonly,nonatomic,strong)
を使用する(readonly,nonatomic)
コードに違いが生じますか? 例えば。キーワードなしで宣言すると、プロパティがポインターに格納される場所としてオブジェクトポインターが格納されますか?strong
__unsafe_unretained
strong
__strong
ありがとう!
編集
したがって、私が理解しているように、読み取り専用プロパティには次のことが当てはまります。
- 非 NSObject* タイプ (int、float、void* など) の場合は、 を使用します
(readonly, assign)
。 - オブジェクト ポインターの場合、
(readonly, strong)
or(readonly, copy)
- これらの機能は読み取り専用プロパティと同じですが、プロパティを として拡張/サブクラス化して再宣言する場合は、コピー セマンティクスが必要になる場合がありますreadwrite
。 - オブジェクト ポインターの
(readonly, weak)
場合、そのプロパティに既に弱いポインターを格納する場合にのみ意味があります (そのポインターは他の場所で強い必要があります。そうしないと、オブジェクトの割り当てが解除されます)。