0

次のエラーが発生する次のコードを書いています

@implementation ViewController
NSArray *myArray = [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil ];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
 }

「myArray」を宣言した行で「コンパイル時の定数ではない初期化要素」を取得しています..

「.h」ファイルではなく「.m」ファイルで配列を初期化していることに注意してください。

4

3 に答える 3

1

前述のように、グローバル変数を宣言しました。

代わりに単純な関数を使用できます。

static NSArray * NamesArray() {
  return [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil];
}

それはおそらくあなたが望むものではなく、グローバルを作成する必要はまったくありませんがNSArray、ソースを Objective-C++ としてコンパイルしている場合は、実際にはコンテナー リテラル式を使用してグローバルを初期化できます。

// requires Objective-C++
static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];

この配列とその要素の作成は難しくないため、次のことを行う必要があります。

  • 関数を使うだけ
  • または頻繁にキャッシュしてアクセスする必要がある場合はivar

作成するのに非常にコストがかかる場合は、次の形式を好む可能性があります。

// requires Objective-C++
static NSArray * Names() {
    static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];
    return arr;
}

必要になるまで構築されないためです。グローバルな初期化は非常に問題になる可能性があります。

于 2012-08-21T19:31:29.143 に答える
1

グローバル変数または静的変数を初期化する場合は、コンパイル時の定数を使用する必要があります。基本的に、コンパイラはその値をオブジェクト ファイルに書き込む必要があります。コードが複数のメッセージを送信していますが、これは実行時にのみ実行できます。

これが本当にグローバル変数でなければならない場合は、何らかの方法で初期化する必要があります。+initializeなどに使われることが多いです。

于 2012-08-21T19:20:37.553 に答える
0

myArrayをivarにして適切な場所で初期化するか、クラスに静的グローバルを作成して「initialize」クラスメソッドで初期化します。

于 2012-08-21T19:14:18.233 に答える