2009-08-21 15 views
8

ほとんどのObjective-Cコーダーは、インスタンス変数に直接アクセスするときにself->ivar構文を使用しないことに気付きました。私が見ているほとんどのサンプルコードは、のないインスタンス変数を参照するだけです。私はインスタンス変数を参照するのはむしろ混乱していると思います。インスタンス変数はインスタンス変数であり、単に現在のスコープの変数ではないことを明確にする必要はありません。インスタンス変数に直接アクセスするときにself-> ivarを使用する

私はのようなものを書きたいように私は感じる:

- (void)dealloc { 
    [self->someVar release]; 
    [self->anotherVar release]; 
    [super dealloc]; 
} 

または

- (void)setVar:(Foo *)newVar { 
    [self->var autorelease]; 
    self->var = [newVar retain]; 
} 

は機会の全体の多くはありません、我々はこれまでにも、使用しなくても、当社のインスタンス変数にアクセスする必要があるときカプセル化のためのアクセッサですが、deallocやカスタムgetterやsetterのようにする必要があることもあります。

私はこのために悪い人/プログラマーですか?このようなコードを書いていないという理由が本当にあるのでしょうか?このようにするのは本当に良いと感じているからです。

答えて

7

チャックは正しいとは限りません。テクニカル理由はローカル変数でivarsをシャドーしている場合を除き、そのように書くべきではありません。これは一般的には悪い考えです。しかし、self->を省略した方が洗練されていて、冗長なコードになっていることは間違いありません。個人的に私はself->が気が散っている(特にコードがうまく設計されていて、変数に名前が付けられている)場合があります。他のObjective-Cプログラマにコードを公開すると、意見が矛盾している可能性が高いので、肌を考えるのは良いことです。さらに、ほとんどのプログラマーは、コードを「気分が良い」ものにするという認識が、時間とともに、そして経験に基づいて変化し、その意見はしばしば時代とともに穏やかであることを見出している。 :-)

+2

私が言ったように、それはより短いです。私はそれを好むが、短い識別子が常に優れているという議論をすることはできないが、私はすべてx、y、zのコードを維持することは嫌いだ。それは本質的にあなたの幸せな媒体を見つける場所の問題です。私は、Pythonがおそらく 'self->'形式を好むだろうと思う。もちろん、Objective-Cで直接ivarアクセス​​を行うべきではありません。おそらく魅力的でないかもしれないということは、 'self->'構文のもう一つの美徳です。 – Chuck

+0

Lol。 "肌を考える"。それは薄くて厚いのですか? – Rob

7

このように書くべきではありません。とにかく彼らはイナバルをシャドーイングするのを避けようとしているので、人々はそれを別の方法で書く傾向があると思うので、彼らが話している変数にあいまいさがあってはならない。

+0

すばやくお返事いただきありがとうございます。 –

4

短い答え:いいえ、あなたはそれのために悪いプログラマーではありません:)このようにコードを書かない理由もありません。ほとんどのプログラマーは単に怠け者であり、一生のうちに疲れた方法を書いたことはありません。

長い答え:技術的には、 "self->"のない変数にアクセスすると、コンパイラはローカルスコープ内でその名前の変数を最初に検索し、見つからなければインスタンス変数で検索を繰り返します。そこにヒットした場合、実際に "self - > ..."が書かれているかのようにコードが生成されます。インスタンス変数に一致するものがなければ、コンパイラはグローバルスコープBTW内で試行します。

ほとんどのプログラマーは自分のコードを読んでいるだけで、インスタンス変数とは何かをよく知っています。プログラマがすべての変数アクセスについて完全に明確にしたとき、あなたは本当に感謝しています。このメソッドのローカル変数、オブジェクトのインスタンス変数、または可能であればグローバル変数(このクラスのすべてのインスタンスまたは可能であればアプリケーションのグローバル変数)を返します。名前が似ていて、特殊な名前やアクセスパターンがなくても、さまざまな種類の変数があれば、すぐに監視が失われるので、感謝しています。また、Xcodeのシンタックスハイライトがローカル変数とは異なる方法でインスタンス変数を強調表示しているという事実に頼っているのは、プログラマがXcodeでコードを編集しなければならないし、変数はローカル変数と同じ色です。

self->を介してインスタンス変数にアクセスすることは完全にうまくいきますが、接頭辞/接尾辞を使用することも考えられます。インスタンス変数であることが明らかになり、メソッドパラメータやローカル変数との競合も避けられます。

1

Objective Cは自動的にi-var名にアンダースコアを追加します。したがって、 "_someVar"が表示されたときは暗黙的にクラススコープになります。アンダースコアは、self->を追加しなくてもその範囲をクリアするのに十分な視覚的マーカーです。

+0

'_someVar'が' dealloc'でリリースされたり、カスタムセッターで設定されているのを見れば、あなたはivarであると合理的に確信できます。しかし、それらのコンテキストで 'someVar'を見た場合、私はおそらくそれがまだ手動で定義されているか手動で合成されたもの(' @ synthesize')だけであると仮定しています。要するに、先行する '_'は、それが暗黙のうちに「ivar」であることを意味すると言っても過言ではありません。アンダースコアは、必要条件でも十分条件でもありません。しかし、あなたはベストプラクティスがプロパティを使用して、イーバールをあなたのために合成できるようにすることが正しいです、そして、彼らは先頭のアンダースコアを持っています。 – Rob

関連する問題