2013-02-20 45 views
30

Tôi khá mới đối với Objective-C và iOS nên tôi đã chơi xung quanh với Picker View. Tôi đã định nghĩa một Class Person để khi bạn tạo một Person mới, nó sẽ tự động cung cấp cho người đó một tên và tuổi.Khởi tạo mảng đối tượng sử dụng 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 

Bây giờ tôi muốn tạo một nhóm người để tôi có thể ném một nhóm vào bộ chọn, chọn một người và hiển thị tuổi của họ. Đầu tiên, mặc dù tôi cần phải tạo ra một mảng Người. Làm cách nào để tạo một mảng các đối tượng, khởi tạo và phân bổ chúng?

+3

Tôi đã nửa chừng trả lời khi Người phụ trách đánh bại tôi với câu trả lời chính xác. Tuy nhiên, tôi tìm thấy tên đầu tiên trong tên của bạnArr là tuyệt vời: D – Bergasms

Trả lời

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 

bạn cũng có thể đạt được điều này mà không sử dụng NSMutableArray:

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

Một điều nữa - đó là giá trị trong môi trường ARC kích hoạt, nếu bạn sẽ sử dụng nó mà không ARC đừng quên để thêm đối tượng autoreleased thành mảng!

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

Đối với thứ hai nó sẽ hiệu quả hơn và thẳng thắn hơn để tạo ra mảng có thể thay đổi và tạo một bản sao của nó, vs tạo N mảng người mới. –

+1

Nó là dạng tốt hơn để sử dụng '[person copy]' thay vì 'arrayWithArray:' IMO. (Ồ, tôi thấy rằng bình luận ở trên là như nhau ... xin lỗi) – borrrden

66

Ngoài ra còn có một cách viết tắt để làm điều này:

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

Đó là tương đương với

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

Như iiFreeman nói, bạn vẫn cần phải làm quản lý bộ nhớ thích hợp nếu bạn không sử dụng ARC.

+0

Tôi đã thử điều này nhưng tôi tiếp tục nhận được một lỗi 'undeclared identifier' trên person1,2,3 vv –

+1

Các đối tượng person1, 2 và 3 có được khai báo ở bất kỳ đâu không? –

9

Không ai nhận xét về phương pháp randomAge?

Điều này quá tệ đến mức không thể sai được.

NSInteger là kiểu nguyên thủy - rất có khả năng được nhập là int hoặc dài. Trong phương thức randomAge, bạn tính một số từ khoảng 1 đến 98.

Sau đó, bạn truyền số đó thành một NSNumber *. Bạn phải thêm một diễn viên bởi vì trình biên dịch đã cho bạn một cảnh báo rằng bạn không hiểu. Điều đó làm cho cảnh báo biến mất, nhưng để lại cho bạn một lỗi khủng khiếp: Con số đó buộc phải là một con trỏ, vì vậy bây giờ bạn có một con trỏ tới một số nguyên ở đâu đó trong 100 byte đầu tiên của bộ nhớ.

Nếu bạn truy cập NSInteger qua con trỏ, chương trình của bạn sẽ bị lỗi. Nếu bạn viết qua con trỏ, chương trình của bạn sẽ bị lỗi. Nếu bạn đặt nó vào một mảng hoặc từ điển, chương trình của bạn sẽ bị lỗi.

Thay đổi nó thành NSInteger hoặc int, có lẽ là tốt nhất, hoặc để NSNumber nếu bạn cần một đối tượng vì lý do nào đó. Sau đó tạo đối tượng bằng cách gọi [NSNumber numberWithInteger: 99] hoặc bất kỳ số nào bạn muốn.

-1

Cách tạo NSArray, NSMutableArray .... ??

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

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil]; 
Các vấn đề liên quan