Creacio de dos objectes
Hola, tinc un problema, creo dos objectes de la mateixa clase que te un metode que reb un int y retorna la suma de les vaguades que envio un numero que sempre es 1, o sigui envio un 1 y retorna 1 despres envio un altre 1 y retorna 2, donçs be amb el segon objecte si li envio un 1 per exemple em retorna la suma del primer objecte mes el 1 o sigui 3, yo el que pretenc es que vagin per separat pero sense perdre les dades del primer objecte y del segon,no se si me explicat be, aqui esta el codi:
@implementation uno
int numero;
-(void)setnumero:(int)num {
numero = numero + num;
}
-(int)numero {
return numero;
}
@end
y desde aqui creo els objectes:
@implementation cont
- (IBAction)boton:(id)sender {
uno *a = [[uno alloc]init];
[a setnumero:1];
int na = [a numero];
NSLog(@"numero a = %i ",na);
}
- (IBAction)boton2:(id)sender {
uno *b = [[uno alloc]init];
[b setnumero:1];
int nb = [b numero];
NSLog(@"numero b = %i ",nb);
}
@end
Seria facil crea dos metodes diferents amb variables diferents una per cada objecte pero es que vull crea molts objectes.
La pregunta mes clara seria, ¿no es poden crea objectes de la mateixa clase y que la variable nomes respongui al objecte que la crida?.
30 abril 2009 21:15
Hola Lluís,
T'explico un parell de coses.
A l'hora de programar amb Objective-C és recomanable que el nom de les classes comenci amb majúscula, així es diferencia del nom de les variables. Així que jo et recomanaria anomenar-la "Uno" en comptes de "uno".
Una altra cosa interessant és utilitzar un parell de lletres o tres davant del nom de la classe per evitar que ja n'existeixi una d'igual. Per exemple els d'Apple acostumen a ficar-hi "NS" (Next Step) en la majoria de les seves classes, tot i que en algunes hi fiquen "CG" (Core Graphics), … Jo faig servir "XC" (Xin Cat) en les llibreries i en els projectes una combinació del nom del projecte, per exemple: "MCT" (Macat), …
Entrant en el teu problema, veig que tens un error. La variable "numero" que has definit és una variable de classe, això vol dir que és comuna a totes les classes de tipus "uno". I si la modifiques en un objecte se't modifica en tots.
Una altra cosa que cal dir és que no és bo utilitzar els mètodes que comencen amb "set" i "get" per coses diferents a establir i obtenir el valor d'una variable. Si el que vols fer és sumar seria millor quelcom com "sumNumero:".
Una altra cosa interessant és utilitzar el mètode "description" per retornar una representació d'un objecte en forma de cadena de text. La pots fer servir per depurar o per mostrar-la en algun element d'una interfície gràfica.
Per arreglar-ho hauries de definir la variable número com una variable d'instància. Així:
M'he pres la llibertat d'adaptar-te-la una mica (LLUno). "LL" -> Lluís. També he modificat el nom de la variable a "_numero" però no és necessari, és la forma que tinc jo per indicar que la variable només s'hi ha d'accedir directament des de la pròpia classe, tu pots utilitzar "numero" sense cap problema.
Seria interessant crear un mètode d'Init, tot i que per defecte totes les variables queden inicialitzades a 0. Jo t'he n'he ficat un parell per si t'interessen.
LLUno.h
#import <Cocoa/Cocoa.h>
@interface LLUno : NSObject
{
int _numero;
}
#pragma mark Init Methods
- (id) init;
- (id) initWithNumero:(int)tNum;
#pragma mark Access Methods
- (int) numero;
- (void) setNumero:(int)tNum;
- (void) sumNumero:(int)tNum;
#pragma mark Print Methods
- (NSString*) description;
@end
LLUno.m
#import "LLUno.h"
@implementation LLUno
#pragma mark Init Methods
- (id) init;
{
return [self initWithNumero:0];
}
- (id) initWithNumero:(int)tNum;
{
if ( self = [super init] )
{
[self setNumero:tNum];
}
return self;
}
#pragma mark Access Methods
- (int) numero;
{
return _numero;
}
- (void) setNumero:(int)tNum;
{
_numero = tNum;
}
- (void) sumNumero:(int)tNum;
{
_numero += tNum;
}
#pragma mark Print Methods
- (NSString*) description;
{
return [NSString stringWithFormat:@"<object %@: %i>", [self className], _numero];
}
@end
Amb el mètode "description" implementat els NSLog els pots fer diferent. Així quedaria:
- (IBAction)boton:(id)sender
{
LLUno *a = [[LLUno alloc] init];
[a sumNumero:1];
NSLog(a);
}
- (IBAction)boton2:(id)sender
{
LLUno *b = [[LLUno alloc] init];
[b sumNumero:1];
NSLog(b);
}
01 maig 2009 08:43
M'oblidava de dir-te que un cop fet un "init", cal fer un "release" o un "autorelease" quan ja no calgui utilitzar més l'objecte Així els últims mètodes cal afegir-hi una línia més:
- (IBAction)boton:(id)sender
{
LLUno *a = [[LLUno alloc] init];
[a sumNumero:1];
NSLog(a);
[a release];
}
- (IBAction)boton2:(id)sender
{
LLUno *b = [[LLUno alloc] init];
[b sumNumero:1];
NSLog(b);
[b release];
}
01 maig 2009 08:45
Hola ho heprobat pero sempre em surt 1, crec que sempre inicia a 0.
01 maig 2009 12:53
Home, surt 1, perquè s'inicia a 0 i li sumem 1.
LLUno *b = [[LLUno alloc] init];
[b sumNumero:1];
Si utilitzes l'init amb número pots iniciar-lo amb un altre número. Per exemple amb "4":
LLUno *b = [[LLUno alloc] initWithNumero:4];
I si vols que per defecte s'inicia amb un altre número només cal canviar el mètode "init" amb el número adient:
- (id) init;
{
return [self initWithNumero:4];
}
01 maig 2009 13:57
