2012-03-22 24 views
3

私は疑いがあります。それは私には明らかではありません。Objective-C命名規則 - 明確化

@propertymyPropertyというクラス内にあるとします。私たちはそれを合成しながら2つのことを行うことができます。我々はそれに、_someIVarを言う、IVARを割り当てることができ、または私達はただ単に、コンパイラがそのプロパティのために、myPropertyに、同じ名前でIVARを作成するの世話をするその場合には、それを省略することができます。最初のケースでは、ivar_someIVarを使用してプロパティにアクセスできます。 2番目のケースでは、ivarmyPropertyがコンパイラによって作成されました。

今、我々はナビゲーションスタックに既に存在するビューコントローラから別のビューコントローラをプッシュするとき、私の疑問は、ある、我々が使用する、として

[self.navigationController pushViewController:newViewController animated:YES]; 

navigationControllerが、私はそれが必要と仮定し、プロパティですivarが割り当てられている必要があります。 2つの可能性しかありません。

1)アップルは、先にのアンダースコア(_)でivarsの名前を付けるという規則を持っています。この場合、私はpushViewControllerを呼び出すことができます:アニメーション:このような方法、

[_navigationController pushViewController:newViewController animated:YES]; 

2)第二の可能性は、明らかに、無アンダースコアとIVARで、

[navigationController pushViewController:newViewController animated:YES]; 

しかし、コンパイラをどちらの方法でもNavControllerにアクセスすることはできません。どうして?それは私有財産や何かに関係しているのでしょうか、あるいは私はObjective-Cを全く理解していませんか?

+1

なぜこれをやりたいですか?カプセル化を中断しないでください。インスタンス変数は非常に良い理由のためにプライベートです。これらは実装の詳細であり、毎回変更できます。 –

答えて

3

あなたは、AppleがnavigationControllerプロパティを実装するために何をしたのかわからないので、UIViewControllerクラスのどこかに_navigationController ivarが浮動していると考えることはできません。ケースインポイント:プロパティを@dynamicとして宣言することができます。その場合、実装はまったく何でもかまいません。

プロパティ自体を見るだけで、プロパティをバックアップするivarを推測する方法はありません。

+1

* @ dynamic *プロパティについて私に思い出させてくれてありがとう。 – EmptyStack

2

象牙の名前で推測することはできません。さらに、スーパークラスで宣言されたイーバールにアクセスしようとするべきではありません。そして第3に、navigationControllerプロパティがivarによってサポートされているという保証はなく、その値を計算するカスタムゲッターによってサポートされる可能性があります。

+0

それはカスタムゲッターかもしれないという点が良い。 – louielouie

+0

確かに良い点です。 – EmptyStack

2

私たちはUIKitのソースを持っていませんので、ivarが何を呼び出すのかを明確にすることはできません。

しかし、Appleのコンベンションは、_ivarのようです。

アップルは@privateを使用してprivate ivarとして_navigationController(またはそれを呼び出すことができる)を宣言しました。つまり、ivarにはサブクラスではなくそのクラスのインスタンスからしかアクセスできません。

また、そのプロパティは読み込み専用と宣言されているため、Appleに書き込むことはできません。つまり、Appleが本当に変更したくないということです。

ivar名には2つ以上の可能性があることに注意してください。プロパティは任意の名前のivarで表すことができます。あなたは、Appleのドキュメントを見れば、彼らは例があります。

@synthesize firstName, lastName, age=yearsOld; 

これはfirstNameの、lastNameの、年齢のためのアクセサメソッドを合成し、プロパティの年齢はインスタンス変数yearsOldで表現されていることをする必要があることを指定。