1

ストレージ仕様 + インスタンス変数なしでプロパティを宣言すると、すべてうまくいきます。

@interface Foo : NSObject {
    NSSomething* mySomething;
}
@property (readonly) NSSomething* mySomething;

しかし、インスタンス変数の宣言を削除すると、ストレージ タイプを指定する必要があることを示すコンパイル エラーが表示されます。

@property (readonly, strong) NSSomething* mySomething;

これは私が強いと宣言するだけでよいのだろうかと思いましたが、とにかく読み取り専用でなければなりません..ここで何が起こっているのですか? どの場合にどのアプローチを使用する必要がありますか?

編集(問題を再現できない場合):

ここに画像の説明を入力 ここに画像の説明を入力

4

2 に答える 2

3

あなたはそれを正しく持っています。読み取り専用にする場合は、必ず読み取り専用のままにしておきます。

ただし、ivarを合成する場合は、コンパイラーは、ivarを強力、脆弱、または安全でないトレーニングなしにするかどうかを知る必要があります。デフォルトはassignで、これは安全でない未保持に変換されます(これはおそらくあなたが望むものではありません)。他の人は、コンパイラが警告なしにデフォルトを適切に処理すると報告していますが、問題が発生しているため、プロパティ宣言に保持属性が必要です。

または、最初に行ったように、自分でivarを宣言することもできます。

于 2012-04-05T11:56:27.797 に答える
1

他の誰かがそれを参照しなくなったときに yourSomething が消えることを望むかどうかに応じて、strong または weak のいずれかを指定する必要があります。プロパティがインスタンス変数に基づいている場合、プロパティは自動的に強力になります。

また、上記の決定とは別に、セッターを持たせたくない場合は、プロパティを読み取り専用に設定する必要があります (そのため、誰も yourObject.yourSomthing=something を設定できなくなります)。これは、(.m ファイルでプロパティを readwrite として個人的に再宣言しない限り) yourSomething を直接設定する方法がないことを意味します。これは、ゲッターが変数に依存せず、代わりに他の方法で戻り値を計算する場合に役立ちます。

于 2012-04-05T11:57:19.937 に答える