Создание массива объектов в Objective-C. - PullRequest
20 голосов
/ 05 сентября 2010

Играю с 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

Я придерживаюсь, если очень просто, пока пытаюсь и учусь.

Теперь мой класс Controller.Я хочу создать массив из 40 объектов «Персона».Но я не знаю, как правильно указать это в коде на 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

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

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

Ответы [ 2 ]

51 голосов
/ 05 сентября 2010

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

29 голосов
/ 05 сентября 2010

Вот пример, который создает переменную экземпляра 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...