2011-10-31 10 views
19

最初からiOSアプリケーションをビルドしていますが、エラーがあります。ソースは、テンプレートから作成開始したので、そのappdelegate.hは次のようになります。@interfaceまたは@protocolの中で変数を宣言できません

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
} 

BOOL  myBool;  // intended to be globally accessible 
NSString *myString; // intended to be globally accessible 

@end 

私はグローバル変数にとして、他の多くの.mソースファイルからのmyString * myBoolを参照してください。

XCode 3.2.6以下では、コンパイル時に問題が発生したことを覚えていません。

3.2.6では、コンパイル時に、appdelegate.hのこれらのグローバル変数を指し示す警告が表示されました。「変数は@interfaceまたは@protocolの中に宣言できません。コンパイルやアプリケーション実行時にそれ以上の問題はなかったので、残念ながら私はこれらの警告を考慮しませんでした。

XCode 4.2を使用して、以前の警告がビルドエラーに変わったため、このソースをコンパイルできません。それらは参照し、 "グローバル変数"への参照がある異なる.mファイル内の各行を指します。

これらの変数/参照にグローバル変数としてアクセスしたいと考えて、この問題を簡単に修正する方法はありますか?

その他の質問:これまでに受け取った回答(皆さんありがとう)、XCode v3.2.6の下で警告が表示されなかった理由、3.2.6の警告私の側からの本当の誤りですか?なぜコードはまだコンパイルされていて問題なく実行できるのでしょうか?

+0

この意味での「グローバル」変数は、通常、悪い考えですオブジェクト指向プログラミングでは、ローカリティとカプセル化に逆らっています。このテーマについてオンラインでたくさんの読書があります。 –

答えて

30

彼らはそこに行くことができません。

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
BOOL  myBool;  // intended to be globally accessible 
NSString *myString; // intended to be globally accessible 
} 

@end 

そして、それらを実装クラスに対してグローバルにすることができます。しかし、アプリケーションのすべてのクラスにグローバルにしたい場合は、App-Prefix.pchファイルにドロップする必要があります。

+1

私が最後にしたのは、別々の "global_variables.h"ファイルを作成し、これらの変数をすべて#includeとappdelegate.hにインクルードして、それを動作させることでした。 :) – cactusdev

+0

これは正に、私が今まで見た中で最も醜い構文の組み合わせです。私はそれがプリコンパイラのフラグだが、それはそんなに混乱している。 – Sirens

1

Cグローバル変数は、.hヘッダーファイルではなく、.mインプリメンテーションファイルで宣言する必要があります。 extern宣言は.hヘッダファイルに入ります。通常、インクルードの後でインタフェース宣言の外に出ます。

グローバルオブジェクトポインタをnilに初期化することもお勧めします。そうでない場合は、ガベージオブジェクトリファレンスが含まれている可能性があります。

3

@interfaceブロック内の変数についてコンパイラが不平を言っているので、@interfaceまたは@endより上に移動してください。実際には、ヘッダー内のファイルをexternに変更し、.mファイルで実際に宣言したいと思うでしょう。

10

クラスのパブリックメンバーとして定義しようとしていますか? Objective-Cのクラスはあなたが慣れ親しんでいるかもしれない他の言語とはかなり異なっています。中括弧の外側では、メソッドだけを定義できます。あなたは公的にアクセス可能なメンバーを作りたい場合は、プロパティとしてそれらを定義:

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
    BOOL _myBool; 
    NSString *_myString; 
} 

@property BOOL  myBool;  // intended to be globally accessible 
@property NSString *myString; // intended to be globally accessible 

@end 

ような何かその後、あなたの@implementationで:

@implementation myAppDelegate 
@synthesize myBool = _myBool; 
@synthesize myString = _myString; 

を次にあなたがそうでmyObject.myBoolとしてそれらにアクセスすることができます。

クラスのすべてのインスタンスの静的(「グローバル」)データにする場合は、他のポスターが述べたように、定義を.mファイルに移動したい(理想的にはstaticリンクの問題は発生しません)。

+0

私はそれらをプロジェクトのすべてのクラスで利用できるようにしようとしています(つまり、私は「グローバル」と言います)。だから私はすべての.mファイルからアクセスできるようにしたい。 – cactusdev

+2

さて、長期的にやりたいことは、 '@interface'などの外部の.hファイルにそれらを入れて、それらを' extern'宣言してから、変数自身を宣言するソースファイルを一致させることです(修飾子なし)。 .hで非externと宣言されているだけなら、リンクの問題に遭遇する可能性があります。 – fluffy

関連する問題