英子らが正解した。
簡単な方法は次のとおりです。プライベートメンバー変数に直接アクセスします。
例
ヘッダーの.hファイル:
@property (strong, nonatomic, readonly) NSString* foo;
実装.mファイル:
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
それだけです、それだけで十分です。ムスも大騒ぎもない。
細部
Xcode 4.4およびLLVMコンパイラ4.0(Xcode 4.4の新機能)以降、他の回答で説明されている雑用をいじる必要はありません。
synthesize
キーワード
- 変数を宣言する
- 実装.mファイルでプロパティを再宣言します。
プロパティを宣言した後foo
、Xcodeがアンダースコアのプレフィックスで名前が付けられたプライベートメンバー変数を追加したと想定できます_foo
。
プロパティが宣言されている場合readwrite
、Xcodeはというゲッターメソッドfoo
とというセッターを生成しsetFoo
ます。これらのメソッドは、ドット表記(my Object.myMethod)を使用すると暗黙的に呼び出されます。プロパティが宣言された場合、readonly
セッターは生成されません。つまり、下線付きのバッキング変数自体は読み取り専用ではありません。readonly
何セッターメソッドは、値を設定するために、ドット表記法を使用し、したがって合成されず、単にたことを意味し、コンパイラエラーで失敗します。存在しないメソッド(セッター)をコンパイラーが呼び出せないため、ドット表記は失敗します。
これを回避する最も簡単な方法は、アンダースコアで名前が付けられたメンバー変数に直接アクセスすることです。アンダースコアの名前が付いた変数を宣言しなくても、そうすることができます。Xcodeはビルド/コンパイルプロセスの一部としてその宣言を挿入しているため、コンパイルされたコードには実際に変数宣言があります。ただし、元のソースコードファイルでその宣言を確認することはできません。魔法ではなく、単に構文上の砂糖です。
を使用するself->
と、オブジェクト/インスタンスのメンバー変数にアクセスできます。これを省略して、var名を使用することもできます。しかし、自分のコードを自己文書化するので、私はself + arrowを使用することを好みます。あなたが見たときself->_foo
、あなたは曖昧さなくて知っている_foo
このインスタンスのメンバ変数です。
ところで、ダイレクトIVARアクセス対プロパティアクセサの賛否両論の議論は、あなたが先生に読んであげる思いやりの治療の正確一種であるマット・NeubergのプログラミングのiOSブック。読んで再読するのはとても役に立ちました。