1

私のメインの iOS プロジェクトでは、次の状況があります

NSString* s[] = {@"1", @"2", @"3", @"4"};

file2.m には次のものがあります。

extern NSString** s;

同じ file2.m で、以下のメソッドは「認識されないセレクタ '長さ' がインスタンスに送信されました」で失敗します。

- (void) someMethod {
    int len = [s[0] length];
}

新しいデモ プロジェクトを作成し、上記のコードをコピーすると、すべてが期待どおりに機能します。
私の主なプロジェクトの問題は何ですか?問題を見つけようとして、ここで2日間立ち往生しています。
同じ問題が int 配列でも発生しますが、配列内の要素にアクセスしようとすると不正なアクセス例外が発生するという違いがありますが、XCode デバッガーは配列の内容を正常に表示します。

4

3 に答える 3

1

で宣言されたグローバル配列名が の呼び出しで参照する配列の名前と一致externすることlength(つまり、sinextern NSString** s;[s[0] length]が同じ名前) を確認してください。グローバルを「シャドウ」します。小規模なプロジェクトではコードが正常に機能するため、名前の競合が発生する可能性が最も高くなります。slength

于 2013-05-31T14:38:46.967 に答える
0

extern NSString** s;

NSString オブジェクトのポインターへのポインターを宣言するだけで、正しい宣言は次のようになります。

extern NSString *s[];
于 2013-05-31T14:35:18.967 に答える
0

そこで何が起こっているのか、いくつかのアイデアがあります。

  1. 配列をどこかで上書きしています。定数 C 配列を次のように宣言すると常に役に立ちます。const

  2. 変数名の衝突
    同じ名前でオブジェクトが異なる 2 つのグローバルがあります。のような名前のグローバルを使用すると、s簡単に衝突が発生する可能性があります。クラスや列挙型などに対して行っているのとまったく同じように、必ずグローバルにプレフィックスを使用してください。

于 2013-05-31T14:36:44.143 に答える