2009-09-05 15 views
5

いただきまし違い:Objective Cの - 静的メンバと定数

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

@interface SomeClass : NSObject { 

} 
NSObject *something; 

?また、Javaのの最終的なとObjective C(C)のの間の違いは何ですか?1.クラスだけがそれを必要とするとき** ** 2他のクラスが読むことができるプロパティはどこですか?私は既に#defineについて知っていますが、毎回新しいものを作成するので、オブジェクトにはあまり適していません。ありがとう!

答えて

7

前者はインスタンス変数であり、SomeClassのインスタンスごとにsomethingを作成します。これはCのに似ています

後者は、SomeClassとの実際の関連付けを持たないグローバル変数を宣言します。 Cでは、

NSObject *something; 

とグローバルスコープで定義されています。 Objective-Cは実際にクラス変数を持たないので、グローバル変数が使用されます(むしろ、時々使用されます; compilation unitのスコープとスタティックstorage classの変数が使われるべきです)。

"クラス"変数を定義する最もクリーンな方法は、実装ファイルに静的変数を定義することです。そうすれば、クラスメソッドだけがそれにアクセスでき、グローバル名前空間の汚染を避けることができます。一般に公開したい場合は、アクセサーを定義してください。

クラス変数を正しく破棄するのは難しい場合があります。メモリは再利用され、アプリケーションが終了すると開いているファイルは自動的に閉じられますが、他のリソースはあまりうまく処理されません。

2

"final vs const"質問に関しては、どちらも似ています。彼らは値が変わることができないと述べている。 Javaでは、すべての値(プリミティブを除く)はポインタであるため、ポインタが指しているオブジェクトは下に変更できますが、メモリの場所(ポインタ)は決して変更されません。私はObjective Cで同様の動作が期待されると思います。オブジェクト内の値を変更することができるので、変更可能な要素に「final」または「const」を許可しないことは常に良い考えです。

+0

"final"は、constポインタ( " const *' ")へのポインタではなく、constポインタ(" * const' ")に似ています。これはC++の参照型( "&' ")と非常によく似ています。 – outis

+0

ありがとうございます。私はいつも特別なケースを混乱させています:) – aperkins

+0

それが混乱していると思われる場合は、http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/をご覧ください。 – outis

関連する問題