Подтвердить что ты не робот

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

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

Если кто-то будет так добр, чтобы показать мне несколько простых вызовов в массиве объектов, я был бы бесконечно благодарен.

Моя модель:

Person.h

#import <Foundation/Foundation.h>

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

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

@end

Person.m

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

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

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

controller.h

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

-(void) doSomeWork;

@end

Controller.m

#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

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

Заранее благодарим за чтение моего сообщения.

4b9b3361

Ответ 1

Вот пример, который создает переменную экземпляра 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

Ответ 2

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

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

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

  • В массивах 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:, который позволяет передавать другой массив (который может быть изменен), и конструктор будет использовать объекты из предоставленного массива при создании нового.