ti-enxame.com

Fazendo uma matriz de objetos em Objective-C.

Estou brincando com o XCode há cerca de duas semanas e lendo um pouco sobre o MVC. Estou com um problema ao tentar conectar o modelo ao controlador porque acho difícil entender as matrizes. Eu posso lidar com matrizes simples quando programei algumas em Java, mas estou intimidado com o Obj-C NSArrays que vejo.

Se alguém fosse tão gentil em me mostrar algumas chamadas simples sobre uma série de objetos, ficaria eternamente grato.

Meu modelo:

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

Mantive-me muito simples enquanto tento aprender.

Agora minha classe Controller. O que eu quero fazer é criar uma matriz de 40 objetos 'Pessoa'. Mas eu não sei a maneira correta de colocar isso em código no 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

Meu problema está em como declarar a matriz de objetos pessoais de tamanho 40. E então em como acessar a matriz para ler e gravar nela.

Agradecemos antecipadamente por ler meu post.

20
user440096

Aqui está um exemplo que cria uma variável de instância NSMutableArray na classe Controller e adiciona um objeto Person a essa matriz sempre que você evoca 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
29
ennuikiller

Matrizes em Objective-C com Cocoa/CocoaTouch são bem diferentes de Java. As três principais diferenças são:

  1. As matrizes Obj-C são apenas classes como qualquer outra e não têm suporte interno no idioma. Em Java, as matrizes têm um suporte interno na linguagem através do [] operadores.

  2. As matrizes Obj-C não são tipadas, elas pegam qualquer objeto que herda de NSObject. Isso significa que você pode misturar tipos na mesma matriz, embora isso provavelmente seja uma prática ruim, a menos que você tenha um bom motivo para fazê-lo. (Observe que int, double, char, BOOL e outros tipos internos não herdam de NSObject, então você ' teria que envolvê-los em objetos NSNumber se você quiser mantê-los em uma matriz.)

  3. As matrizes Obj-C realmente não têm um conceito de comprimento fixo, a menos que toda a matriz seja imutável. Portanto, você não precisa decidir sobre o comprimento ao criar a matriz.

Para criar uma matriz mutável, ou seja, onde você pode alterar os objetos (e até adicionar e remover objetos, alterando o comprimento da matriz), crie um NSMutableArray:

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

Para adicionar um objeto, como uma instância do seu Person, chame o addObject:, criando um novo Person ali ou fornecendo um ponteiro para um já existente:

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

Para remover um objeto, você pode usar removeObjectAtIndex: ou removeLastObject. Para substituir, você chama replaceObjectAtIndex:withObject:. Para inserir um objeto no meio da sua matriz (e lembre-se, isso também aumentará o tamanho da matriz), você chama insertObject:atIndex:.

Isso abrange os métodos mutantes mais importantes, ou seja, aqueles específicos para NSMutableArray. Obviamente, você também tem os métodos que apenas observam uma matriz e são definidos em NSArray. Os mais importantes são count, fornecendo o número atual de elementos e objectAtIndex:, fornecendo o objeto no índice que você fornece.

Supondo que você tenha alguns objetos Person em sua matriz, é possível iterá-los dessa maneira:

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

Você pode se perguntar como criaria um NSArray como tal, se você não tiver permissão para adicionar a ele. Bem, um de seus construtores é initWithObjects:, que permite escrever uma lista de objetos separados por vírgula a serem adicionados (e você precisa terminar com um valor de nil). Outro é initWithArray:, que permite passar outra matriz (que pode ser mutável), e o construtor usará os objetos da matriz fornecida ao criar a nova.

51
harms