1

この回答によると、グローバル変数を宣言して定義しようとすると、次のエラーが発生します。

   アーキテクチャー armv7 の未定義シンボル:
     「_loggedIn」、参照先:
      -[XYZAppDelegate アプリケーション:didFinishLaunchingWithOptions:] XYZAppDelegate.o 内
      -[XYZFolderViewController viewDidAppear:] XYZFolderViewController.o 内
      -[XYZFolderViewController loginViewController:didEnterUsername:password:] XYZFolderViewController.o 内
ld: アーキテクチャー armv7 のシンボルが見つかりません
clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)

ここで多くの回答を見つけましたが、それらはすべて異なる問題に言及しています (私が言える限り)。

XYZAppDelegate.h

...
extern BOOL はログインしました。
...

XYZAppDelegate.m:

...
@implementation XYZAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ログイン = 0;
    ...
}
...

XYZFolderViewController.h

...
extern BOOL はログインしました。
...

XYZFolderViewController.m

...
@実装
...
- (void)loginViewController:(XYZLoginViewController *)loginViewController
           didEnterUsername:(NSString *)ユーザー名
                   パスワード:(NSString *)パスワード
{
...

    if ([ユーザー名 isEqualToString:ユーザー名] && [パスワード isEqualToString:パスワード])
    {
        ログイン = 1; /* 0 == ログインしていません。 1 == ログインしています。 */
        ...
    }
...
}

このグローバル変数のポイントは、アプリにログインしている (またはログインしていない) ユーザーに関する情報を保持することです。externObjective-C での使用はクリーンなアプローチではないことを認識しています。ただし、extern使用法以外に、他の種類の解決策のヒントをいただければ幸いです。これを期待するのは初歩的な質問です。

4

3 に答える 3

1

アプリで状態をグローバルに利用できるようにすることは、通常はお勧めできません。常に変更可能な状態を最小限に抑えるようにしてください。これを読むか、Functional Programming Priciples Courseをチェックしてください。これらは、より優れたプログラマーになるための出発点として最適です。

このexternキーワードは、定数オブジェクトをどこでも使用できるようにするのに最適です。たとえば、NSStrings。このような:

定数.h

extern NSString* kAKeyPath; 
extern double kPI;

定数.m

NSString * const kAStringContant = @"contact.name";
const double kPI = 3.14159265359;

このように値を使用することは、コンパイラがそれをチェックできるため (覚えておく必要があるのは文字列または int 値だけではありません)、プログラム データ ストアの 1 つのインスタンスに格納されるため (何度も格納する場合と比較して) 有利です。が使用されていない場合externは表示されます)。

于 2013-07-04T21:35:14.140 に答える
0

1 つの問題は、複数のターゲットがある場合に、変数が存在するという約束を含む .h ファイルをインポートしたが、.c または .m を含めていないため、シンボルを持つコンパイル ユニットが欠落している可能性があります。もちろん、複数のターゲットがなくてもこの状態になることはできますが、Xcode は自動的に .m をデフォルトのターゲットに追加するため、通常はその状態にはなりません。

于 2013-07-04T21:40:36.913 に答える