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