iphone - programacion - Haciendo una matriz de objetos en Objective-C.
que es mejor ir al gym o practicar boxeo (2)
Aquí hay un ejemplo que crea una variable de instancia NSMutableArray en la clase Controller y agrega un objeto Person a esa matriz cada vez que 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
He estado jugando con XCode durante aproximadamente 2 semanas, y he leído un poco sobre MVC. Tengo un problema al intentar conectar el modelo al controlador porque me resulta difícil entender los arreglos. Puedo manejar matrices simples cuando NSArrays
algunas en Java, pero me siento intimidado por las NSArrays
Obj-C que veo.
Si alguien fuera tan amable de mostrarme algunas llamadas simples en una variedad de objetos, estaría eternamente agradecido.
Mi modelo:
Persona.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *name;
NSNumber *age;
}
@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;
@end
Persona.m
#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end
Lo he mantenido muy simple mientras intento y aprendo.
Ahora mi clase de controlador. Lo que quiero hacer es crear una matriz de 40 objetos ''Person''. Pero no sé la forma correcta de poner eso en el código en Obj C.
Controlador.h
#import <Foundation/Foundation.h>
@class Person;
@interface Controller : NSObject
{
Person *person;
}
@property(nonatomic, retain) Person *person;
-(void) doSomeWork;
@end
Controlador.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
Mi problema está en cómo declarar la matriz de objetos personales de tamaño 40. Y luego, cómo acceder a la matriz para leer y escribir en ella.
Gracias de antemano por leer mi post.
Las matrices en Objective-C con Cocoa / CocoaTouch son bastante diferentes de Java. Las tres principales diferencias son:
Las matrices Obj-C son solo clases como cualquier otra, y no tienen soporte incorporado en el idioma. En Java, los arreglos tienen un soporte incorporado en el lenguaje a través de los operadores
[]
.Las matrices de Obj-C no tienen tipo, toman cualquier objeto que hereda de
NSObject
. Esto significa que puede mezclar tipos dentro de la misma matriz, aunque esto probablemente sea una mala práctica a menos que tenga una muy buena razón para hacerlo. (Tenga en cuenta queint
,double
,char
,BOOL
y otros tipos incorporados no se heredan deNSObject
, por lo que tendría que envolverlos en objetosNSNumber
si alguna vez quisiera mantenerlos en una matriz).Las matrices Obj-C no tienen realmente un concepto de longitud fija, a menos que toda la matriz sea inmutable. Por lo tanto, no es necesario decidir la longitud al crear la matriz.
Para crear una matriz mutable, es decir, una en la que se le permite cambiar los objetos (e incluso agregar y eliminar objetos, cambiando la longitud de la matriz), crea un NSMutableArray
:
myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.
Para agregar un objeto, como una instancia de su Person
, llame al método addObject:
ya sea creando una nueva Person
allí mismo o dándole un puntero a uno existente:
[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.
Para eliminar un objeto, puede usar removeObjectAtIndex:
o removeLastObject
. Para reemplazar, llame a replaceObjectAtIndex:withObject:
Para insertar un objeto en medio de su matriz (y recuerde, esto también aumentará el tamaño de la matriz), usted llama insertObject:atIndex:
Eso cubre los métodos de mutación más importantes, es decir, aquellos específicos de NSMutableArray
. Por supuesto, también tiene los métodos que solo observan una matriz, y esos están definidos en NSArray
. Los más importantes son count
, que proporciona el número actual de elementos, y objectAtIndex:
proporciona el objeto en el índice que proporciona.
Suponiendo que tienes algunos objetos Person
en tu matriz, puedes recorrerlos de esta manera:
for (int i = 0; i < [myArray count]; i++) {
Person* p = [myArray objectAtIndex: i];
// Do something with p
}
Podría preguntarse cómo crearía una NSArray
como tal, si no tiene permiso para agregarla. Bueno, uno de sus constructores es initWithObjects:
que te permite escribir una lista de objetos separados por comas para agregar (y debes terminar con un valor nil
). Otra es initWithArray:
que le permite pasar otra matriz (que podría ser mutable), y el constructor usará los objetos de la matriz provista cuando haga la nueva.