web-dev-qa-db-ja.com

NSArrayを使用してオブジェクトの配列を初期化する

私はObjective-CとiOSにかなり慣れていないので、ピッカービューで遊んでいます。 Personクラスを定義したので、新しいPersonを作成すると、自動的にその人に名前と年齢が与えられます。

#import "Person.h"

@implementation Person

@synthesize personName, age;

-(id)init
{
    self = [super init];
    if(self)
    {
        personName = [self randomName];
        age = [self randomAge];
    }

    return self;
}

-(NSString *) randomName
{
    NSString* name;
    NSArray* nameArr = [NSArray arrayWithObjects: @"Jill Valentine", @"Peter Griffin", @"Meg Griffin", @"Jack Lolwut",
                            @"Mike Roflcoptor", @"Cindy Woods", @"Jessica Windmill", @"Alexander The Great",
                            @"Sarah Peterson", @"Scott Scottland", @"Geoff Fanta", @"Amanda Pope", @"Michael Meyers",
                            @"Richard Biggus", @"Montey Python", @"Mike Wut", @"Fake Person", @"Chair",
                            nil];
    NSUInteger randomIndex = arc4random() % [nameArr count];
    name = [nameArr objectAtIndex: randomIndex];
    return name;
}

-(NSInteger *) randomAge
{
    //lowerBound + arc4random() % (upperBound - lowerBound);
    NSInteger* num = (NSInteger*)(1 + arc4random() % (99 - 1));

    return num;
}

@end

次に、ピッカーに束を投げ、1人の人物を選択して年齢を表示できるように、一連の人物を作成します。最初に、Personの配列を作成する必要があります。オブジェクトの配列を作成し、初期化して割り当てるにはどうすればよいですか?

37
Howdy_McGee
NSMutableArray *persons = [NSMutableArray array];
for (int i = 0; i < myPersonsCount; i++) {
   [persons addObject:[[Person alloc] init]];
}
NSArray *arrayOfPersons = [NSArray arrayWithArray:persons]; // if you want immutable array

また、NSMutableArrayを使用せずにこれに到達できます。

NSArray *persons = [NSArray array];
for (int i = 0; i < myPersonsCount; i++) {
   persons = [persons arrayByAddingObject:[[Person alloc] init]];
}

もう1つ-ARC対応環境で有効です。ARCなしで使用する場合は、自動リリースされたオブジェクトを配列に追加することを忘れないでください。

[persons addObject:[[[Person alloc] init] autorelease];
40
iiFreeman

これを行う速記もあります:

NSArray *persons = @[person1, person2, person3];

それは同等です

NSArray *persons = [NSArray arrayWithObjects:person1, person2, person3, nil];

IiFreemanが言ったように、ARCを使用していない場合は、適切なメモリ管理を行う必要があります。

70
Allen Zeng

randomAgeメソッドについて誰もコメントしていませんか?

これはひどく間違っているので、これ以上悪いことはありません。

NSIntegerはプリミティブ型です。おそらく、intまたはlongとしてtypedefされます。 randomAgeメソッドでは、約1〜98の数値を計算します。

次に、その番号をNSNumberにキャストできます。コンパイラーが理解できないという警告を出したため、キャストを追加する必要がありました。これにより警告は消えましたが、ひどいバグが残っていました。その数値は強制的にポインターになったため、メモリの最初の100バイトのどこかに整数へのポインターがあります。

ポインターを介してNSIntegerにアクセスすると、プログラムがクラッシュします。ポインターを介して書き込むと、プログラムがクラッシュします。配列または辞書に入れると、プログラムがクラッシュします。

おそらくNSIntegerまたはintに変更します。これはおそらく最適です。何らかの理由でオブジェクトが必要な場合は、NSNumberに変更します。次に、[NSNumber numberWithInteger:99]または任意の番号を呼び出してオブジェクトを作成します。

9
gnasher729

これは実際には質問に答えないかもしれませんが、NSArrayパラメータを必要とする関数に誰かが文字列値をすばやく送信する必要がある場合のためだけです。

NSArray *data = @[@"The String Value"];

1つ以上の文字列値を送信する必要がある場合は、使用することもできます

NSArray *data = @[@"The String Value", @"Second String", @"Third etc"];

次に、次のような関数に送信できます

theFunction(data);
0
JaKK's Team