Создание массива объектов в Objective-C.

играл с XCode около 2 недель и немного читал о MVC. У меня проблема с подключением модели к контроллеру, потому что мне трудно разобраться в массивах. Я могу обрабатывать простые массивы, когда я запрограммировал некоторые на Java, но я тихо запуган Obj-C NSArrays Я вижу.

мой модель:

человек.h

#import <Foundation/Foundation.h>

@interface Person : NSObject 
{
NSString *name;
NSNumber *age;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;

@end

человек.м

#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end

Я сохранил, если очень просто, пока я пытаюсь учиться.

теперь мой класс контроллера. То, что я хочу сделать, это создать массив из 40 объектов "Person". Но я не знаю правильного способа поместить это в код в Obj C.

контроллер.h

#import <Foundation/Foundation.h>
@class Person;
@interface Controller : NSObject 
{
Person *person;
}
@property(nonatomic, retain) Person *person;

-(void) doSomeWork;

@end

контроллер.м

#import "Controller.h"
#import "Person.h"

@implementation Controller

@synthesize person;


-(IBAction)doSomeWork
{
// I guess here is where i should create my array of 40 person objects
}

@end

моя проблема заключается в том, как объявить массив объектов person, размер 40. А потом как доступ к массиву для чтения и записи в него.

заранее спасибо за чтение моего поста.

2 ответов


вот пример, который создает переменную экземпляра NSMutableArray в классе Controller и добавляет объект Person в этот массив каждый раз, когда вы вызываете doSomeWork:

@interface Controller

NSMutableArray *personArray;

@end
@implementation Controller

- (void) viewDidLoad {
    ................
    NSMutableArray *personsArray = [[NSMutableArray alloc] initWithCapacity:40];
}

- (IBAction)doSomeWork {
    Person *myPerson = [[Person alloc] init];
    myPerson.name = name;
    myPerson.age = age;

    [personsArray addObject:myPerson];
}
@end

массивы в Objective-C с Cocoa/CocoaTouch сильно отличаются от Java. Три основных отличия:

  1. массивы Obj-C-это просто классы, как и любые другие, и не имеют встроенной поддержки на языке. В Java массивы имеют встроенную поддержку языка через [] операторы.

  2. массивы Obj-C нетипизированы, они берут любой объект, который наследуется от NSObject. Это означает, что вы можете смешивать типы в тот же массив, хотя это, вероятно, плохая практика, если у вас нет очень веской причины. (Обратите внимание, что int, double, char, BOOL и другие встроенные типы не наследуют NSObject, так что вам придется обернуть их в NSNumber объекты, если вы когда-либо хотели держать их в массиве.)

  3. массивы Obj-C на самом деле не имеют понятия фиксированной длины, если весь массив не является неизменяемым. Поэтому вам не нужно принимать решение о длине, когда вы создаете матрица.

чтобы создать изменяемый массив, т. е. тот, где вам разрешено изменять объекты (и даже добавлять и удалять объекты, изменяя длину массива), вы создаете NSMutableArray:

myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.

чтобы добавить объект, например экземпляр вашего Person, вы называете addObject: метод, либо создание нового Person прямо там, или давая ему указатель на существующий:

[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.

чтобы удалить объект, вы можете использовать removeObjectAtIndex: или removeLastObject. Чтобы заменить, Вы звоните replaceObjectAtIndex:withObject:. Чтобы вставить объект в середину массива (и помните, что это также увеличит размер массива), вы вызываете insertObject:atIndex:.

это охватывает самое важное мутация методы, т. е. те, которые специфичны для NSMutableArray. Конечно, у вас также есть методы, которые только наблюдают массив, и они определены в NSArray. Наиболее важными из них являются count, давая текущее количество элементов, и objectAtIndex:, давая объект по указанному вами индексу.

Предположим, у вас есть какой-нибудь Person объекты в вашем массиве, вы можете перебирать их, как это:

for (int i = 0; i < [myArray count]; i++) {
    Person* p = [myArray objectAtIndex: i];
    // Do something with p 
}

вы можете задаться вопросом, как бы вы создали NSArray как таковой, если вам не разрешено добавлять к нему. Ну, один из его конструкторов -initWithObjects:, что позволяет вам написать список объектов, разделенных запятыми для добавления (и вам нужно закончить nil значение). Другой initWithArray:, который позволяет передать другой массив (который может быть изменяемым), и конструктор будет использовать объекты из предоставленного массива при создании нового.