2012-06-15 10 views

答えて

7

コンパイル時に行うような配列を作成することはできません。コンパイル時定数ではないからです。それはあなたが、私はあなたが(または任意のオブジェクト)あなたが必要とする、そして、それを埋める配列を作成し、テストプロジェクトを作成することができると思い、このプリコンパイルされていることを、本当に重要な場合

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

:代わりに、あなたのような何かを行うことができますそれをファイルに保存するNSKeyedArchiverを使用してシリアル化してから、そのファイルをアプリケーションに組み込みます。次に、NSKeyedUnarchiverを使用してオブジェクトのアーカイブを解除して使用する必要があります。パフォーマンスの違いがこれらの2つのアプローチの間にあるのかどうかはわかりません。このメソッドの利点の1つは、多くのオブジェクトを含む配列を初期化する必要がある場合、大きなコードブロックを持たないことです。

+0

それをプリコンパイルすることは重要ではないので、あなたのソリューションは私にとって完璧に機能します。ありがとう! – MoreFamed

+0

これは、 'viewDidLoad'が実行されるたびに配列を作成します。' nil'テストは良いでしょう。 – Cristik

-1

使用限り私はあなたがより多くを必要とする場合は、インスタンス

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

.. FOR NSArrayのクラスメソッドを使用することができます 1次元配列を必要と理解して、この

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

「str1、str2 ...」は、C配列の初期化子の場合と同じ方法で、 '@"なんらかの文字列 "のようなNSStringリテラルにすることができます。私は、このような文字列が画像のコンパイル時に挿入されると思う。実行時以外で配列自体を初期化できるとは思わない、少なくとも醜い直列化ハックがなければ – walkytalky

+0

これは私のためには機能しません。私はでした NSArray * a = [NSArray arrayWithObjects:@ "foo"、@ "bar"、@ "baz"、nil]; コンパイラは「初期化要素はコンパイル時定数ではありません」と表示します。私はモジュール内のいくつかのルーチン間で配列を共有する必要があるので、配列を宣言してルーチンの外に埋めたいと思っています。 – MoreFamed

+0

-1 MoreFamedが指摘したように、これは必要な方法では絶対に動作しません。あなたのコードは*単一のメソッドで 'array'にアクセスする必要がある場合には動作しますが、クラス全体でアクセスする必要があります。 – FreeAsInBeer

-2

、してくださいあなたの問題についてもう少し詳しくお伝えください。

+0

-1あなたの答えは@shraza'sと同じ問題です。クラス全体で配列へのアクセスを提供するわけではありません。 – FreeAsInBeer

-2

シンプルなもの:NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; Modern ObjectiveCでは、ジェネリックとリテラルの配列が可能です。

NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];は、ジェネリックがオプションであり、配列要素にアクセスする場合にのみ役立ちます。したがって、後でコードをテンプレート化して配列に戻すことができます。

+1

定数/静的としてコンパイルできません。 – Andy

+0

はい、実行時に実行されるように動作しません。 – Cristik

関連する問題