• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

NSArray-Instanz durchmustern

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Hallo zusammen,

wieder mal hab ich eine "Neuling-Frage" was Objective C und Cocoa angeht. Konkret möchte ich gerne erfahren, wie ich ein NSArray durchmustern kann, welches Instanzen einer selbst geschriebenen Klasse enthält. Wenn ich meine Lektüre richtig verstanden habe, ist das mit der For-In-Schleife möglich.

Nun gut, ich poste mal, was ich dazu bisher umgesetzt habe:

Klasse "Person" mit folgenden Membern:
NSString* name;
NSInteger alter;
Person* bruder;

Die Set- und Getmethoden lasse ich mir in der Implementation über @synthesize korrekt erzeugen. Für die Ausgabe habe ich mir eine "-description" - Methode geschrieben, damit ich im NSLog über %@ als Rückgabewert von "Person"-Instanzen den Namen der Person als NSString-Instanz erhalte.

Nun habe ich eine Instanz von NSArray, in welches ich 3 Personinstanzen (nebst nil) hineintue und über die For-In-Schleife ausgeben möchte. Ist das möglich?

Danke im Voraus!

MarCus88

Edit: Ich hab mal ein bisschen herumprobiert nachdem ich ein Beispiel in Apples Onlineentwicklerinformationen gesehen habe. Mein Code schaut folgendermaßen aus:

Code:
NSArray* myArray = [NSArray arrayWithObjects:firstPerson,secondPerson,thirdPerson,nil];
Arrayerzeugung

Code:
for(Person* persons in myArray)
	{
		NSLog(@"%@",persons);
	}
Ausgabe der Personen im Programm

Code:
-(NSString*)description
{
	return [NSString stringWithFormat:@"%@",self.name];
}
description - Methode, welche den Namen von "Person"-Instanzen zurückliefert und eigentlich im Programm an der Stelle %@ aufgerufen werden müsste (oder nicht?)

Ich erhalte keinen Compilerfehler, allerdings auch keine Ausgabe in der Console :(
 
Zuletzt bearbeitet:

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Nun habe ich eine Instanz von NSArray, in welches ich 3 Personinstanzen (nebst nil) hineintue und über die For-In-Schleife ausgeben möchte. Ist das möglich?
Was für ne Frage. Ja natürlich.

Ich erhalte keinen Compilerfehler, allerdings auch keine Ausgabe in der Console :(
Schau mal was im Array drinsteckt. NSLog(@"%@", myArray);

Ansonsten poste mal was wo auch der Fehler ist. Sonst müsstet Du jemanden fragen der hellseherische Fähigkeiten hat. ;)
 
Zuletzt bearbeitet:

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Okay ich poste einfach mal den gesamten Code, dann wird der Fehler vielleicht entlarvt^^

Code:
#import <Cocoa/Cocoa.h>


@interface Person : NSObject {
	NSString* name;
	NSInteger alter;
	Person* bruder;
}
@property(readwrite,copy) NSString* name;
@property(readwrite) NSInteger alter;
@property(readwrite,retain) Person* bruder;

// Objekterzeugung
+(Person*)personWithName:(NSString*)name;
-(id)initWithName:(NSString*)initName;
@end
der Header

Code:
#import "Person.h"


@implementation Person
@synthesize name,alter,bruder;

// overwrite -init method
-(id)init
{
	return [self initWithName:@"Kein Name"];
}

// Convenience-Allocator
+(Person*)personWithName:(NSString *)name
{
	return [[[self alloc] initWithName:name] autorelease];
}

// Initializer
-(id)initWithName:(NSString*)initName
{
	self = [super init];
	
	if(self)
	{
		self.name=initName;
		self.alter=0;
		self.bruder=nil;
	}
	return self;
}

// Description
-(NSString*)description
{
	return [NSString stringWithFormat:@"%@",self.name];
}

// Deallocator
-(void)dealloc
{
	self.name=nil;
	self.alter=0;
	self.bruder=nil;
	
	[super dealloc];
}
@end
die Implementation

Code:
int main (int argc, const char * argv[]) {
    Person* firstPerson;
	Person* secondPerson;
	Person* thirdPerson;
	NSArray* myArray = [NSArray arrayWithObjects:firstPerson,secondPerson,thirdPerson,nil];
	
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	// init instances
	firstPerson=[Person personWithName:@"Klaus"];
	secondPerson=[Person personWithName:@"Bernhard"];
	secondPerson=[Person personWithName:@"Heinz"];
	
	// set age
	firstPerson.alter=22;
	secondPerson.alter=20;
	thirdPerson.alter=43;
	
	// set brother
	firstPerson.bruder=secondPerson;
	secondPerson.bruder=firstPerson;
    
	// print
	NSLog(@"%@ ist %d Jahre alt und hat %@ als Bruder.",firstPerson,firstPerson.alter,firstPerson.bruder.name);
	NSLog(@"%@ ist %d Jahre alt und hat %@ als Bruder.",secondPerson,secondPerson.alter,secondPerson.bruder.name);
	
	// print myArray
	for(Person* persons in myArray)
	{
		NSLog(@"%@",persons);
	}
	
    [pool drain];
    return 0;
}
das Programm

Unter der Kommentarzeile //print myArray möchte ich das Array ausgeben und da ich für die Klasse "Person" auch eine description-Methode habe, die den Namen zurückgibt, sollte das doch so funktionieren oder? In der Console bekomme ich als Ausgabe leider garnichts. :(

Die obigen Ausgaben funktionieren tadellos, daher hab ich richtig initialisiert denke ich.

Gruß
MarCus88
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Problem: 3,5 Fehler in main().

1. Objekt autoreleased erzeugt, den ARP aber noch nicht.
2. Array mit nicht existenten Objekten befüllt.
3a. Variable Objekt doppelt zugewiesen.
3b. Property von nicht existentem Objekt setzen wollen.

zu 1:
Code:
	NSArray* myArray = [NSArray arrayWithObjects:firstPerson,secondPerson,thirdPerson,nil];
	
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

zu 2:
Code:
	NSArray* myArray = [NSArray arrayWithObjects:firstPerson,secondPerson,thirdPerson,nil];
	
	...

	// init instances
	firstPerson=[Person personWithName:@"Klaus"];

zu 3 a & b:
Code:
	secondPerson=[Person personWithName:@"Bernhard"];
	secondPerson=[Person personWithName:@"Heinz"];
	
	...

	secondPerson.alter=20;
	thirdPerson.alter=43;



Mal korrigiert und formatiert (ohne Kommentare)
Code:
#import <Foundation/Foundation.h>
#import "Person.h"

int main (int argc, const char * argv[]) {
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	Person *firstPerson;
	Person *secondPerson;
	Person *thirdPerson;
	
	firstPerson = [Person personWithName:@"Klaus"];
	secondPerson = [Person personWithName:@"Bernhard"];
	thirdPerson = [Person personWithName:@"Heinz"];
	
	NSArray *myArray = [NSArray arrayWithObjects:firstPerson, secondPerson, thirdPerson, nil];
	
	firstPerson.alter = 22;
	secondPerson.alter = 20;
	thirdPerson.alter = 43;
	
	firstPerson.bruder = secondPerson;
	secondPerson.bruder = firstPerson;
    
	NSLog(@"%@ ist %d Jahre alt und hat %@ als Bruder.", firstPerson, firstPerson.alter, firstPerson.bruder.name);
	NSLog(@"%@ ist %d Jahre alt und hat %@ als Bruder.", secondPerson, secondPerson.alter, secondPerson.bruder.name);
	
	for (Person *persons in myArray)
		NSLog(@"%@", persons);
	
    [pool drain];
    return 0;
}
 
Zuletzt bearbeitet:

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Ohje alles klar, wie gesagt Anfängerfehler^^ Da hab ich wohl die Reihenfolge durcheinander gebracht in der ich den Code hätte schreiben müssen. Das eine secondPerson sollte thirdPerson sein, sowas sollte ich wohl nicht mehr kurz nach dem Mittagsschlaf programmieren :D

Vielen Dank und einen schönen Abend noch! :)