2013-02-20 173 views
30

我對Objective-C和iOS非常陌生,所以我一直在玩Picker View。我定義了一個Person類,這樣當你創建一個新Person時,它會自動給這個人一個名字和年齡。使用NSArray初始化對象數組

#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 

現在我想打的人的一個數組,所以我可以拋出一堆入選擇器,挑一個人,並顯示他們的年齡。首先,儘管我需要製造一系列人員。我如何創建一個對象數組,初始化和分配它們?

+3

當iiFreeman用正確答案擊敗我時,我已經半途而廢了。但是,我發現nameArr中的第一個名字很棒:D – Bergasms 2013-02-20 00:54:29

回答

38
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]]; 
} 

一兩件事 - 這是有效的ARC啓用的環境中,如果你要使用它,而不ARC不要忘記加上自動釋放對象進入陣列!

[persons addObject:[[[Person alloc] init] autorelease]; 
+2

對於第二個例子,創建可變數組並創建一個副本,創建N個新人陣列會更高效,更直接。 – 2013-02-20 01:04:46

+1

使用'[複製人員]'而不是'arrayWithArray:'IMO更好。 (哦,我看到上面的評論是一樣的...對不起) – borrrden 2013-02-20 01:27:46

66

也有這樣做的簡寫:

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

這相當於

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

正如iiFreeman說,你還是需要的,如果你不是做正確的內存管理使用ARC。

+0

我試過這個,但我不斷收到person1,2,3等「未聲明的標識符」錯誤等 – 2013-02-20 19:59:30

+1

對象person1,2和3是否在任何地方聲明? – 2013-02-20 22:40:33

9

沒有人評論randomAge方法?

這是非常錯誤的,它不可能是任何人。

NSInteger是一種原始類型 - 它很可能是int型或long型的typedef。 在randomAge方法中,計算1到98之間的數字。

然後,您將該數字轉換爲NSNumber *。你必須添加一個演員,因爲編譯器給了你一個你不明白的警告。這讓警告消失了,但給你留下了一個可怕的錯誤:這個數字被強制爲一個指針,所以現在你有一個指向前100個字節內存中某個整數的指針。

如果通過指針訪問NSInteger,程序將崩潰。如果你通過指針寫入,你的程序將崩潰。如果將它放入數組或字典中,程序將崩潰。

將其更改爲NSInteger或int,這可能是最好的,或者如果您因某種原因需要對象,則將其更改爲NSNumber。然後通過調用[NSNumber numberWithInteger:99]或任何你想要的數字來創建對象。

-1

如何創建NSArray,NSMutableArray ....?

NSArray keys =[NSArray arrayWithObjects:@"key1",@"key2",@"key3",nil]; 

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil];