2012-01-10 9 views
12

main.mファイル内の変数を宣言して、すべてのクラスで使用できるようにするにはどうすればよいですか?objective-c - グローバル変数

私が単にmain関数で宣言した場合、コンパイラはそれがクラスメソッドで宣言されていないと言います。

このようなオブジェクトに宣言する必要がありますか?

@public 
type variable; 

答えて

25

一般的な古いCグローバル変数を使用するだけです。

まず、あなたのmain.mで変数を定義し、あなたのmain関数の前に:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

第二に、あなたは他のソースファイルはそれについて知っている必要があります。それ以外の場合は、その定義となり、あなたが宣言ブロック内の変数に値を代入することはできません

// .h file 

// Declaration of your variable.  
extern type variable; 

注:あなたは、あなたがあなたの変数が必要.mファイルをいくつか.hファイルにそれを宣言し、すべてにそのファイルをインポートする必要があります同じ名前の複数の定義に不平を言ってリンカのエラーで終わります。

物事を明確にする:各変数は複数回(宣言は、この変数がどこかに存在することを言います)を宣言することができますが、は(定義が実際にその変数のメモリを作成します)一度だけを定義しました。

グローバル変数は、ファイルの値が予期せず変更される可能性があるため、エラーをデバッグするのが難しくなる可能性があるため、コーディングの慣習としては不適切です。たとえば、シングルトンパターンを使ってグローバル変数を避けることができます。

+0

芋、グローバル変数は、実際に多くのことが自然であるためには傾向が与えられ、Objective Cの中に多くの意味を作る:このリンクをたどって、定数や静的変数の詳細については、

シングルトン、特にビューコントローラ。この場合、変数よりも定数のように機能します。 – devios1

+0

実際、シングルトンはグローバル変数(共有インスタンス)を使用しているため、すべてのメンバーがグローバルになります。ある種のグローバル性を別のグローバル性と置き換えるだけです。 – Cristik

10

なぜあなたはそれをやりたいのですか?

main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

しかし、このようなものを使用してに着手する前に慎重に考えてください!

+0

なぜ注意が必要ですか?私はリスクが何であるか理解していません – Sirens

+1

リスクは維持不能なコードか、バグを追跡するのが難しいでしょう。 – mattjgalloway

+0

インターネット上でグローバルバールに関するすべての投稿には「注意している」という警告と、「慎重にすべき理由」という警告があります。ハハ、いつも同じジャズです。 注意したくない人:他の人があなたに何度も何度も警告している隠れた理由があるはずだと思う;) – tothemario

2

デバッグ以外にも、アプリケーションロジックと直接対話するためにmain.mファイルを試して修正する必要はありません。

Your_project_name_Prefix.pchファイルで必要に応じて定数を定義できます。または、アプリケーションの代理人、またはあなたのアプリのクラスのいずれかに静的変数を宣言します。

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

varへの読み書きアクセスが必要な場合はこれが機能しません。 E.すべてのクラスにアクセス可能なパスワードまたはセッションIDを保存する場合 –