2010-02-19 16 views
5

Ist es möglich, schnelle Enumeration mit einem NSArray zu verwenden, das ein NSDictionary enthält?Schnelle Aufzählung mit einem NSMutableArray, das ein NSDictionary enthält

Ich laufe durch einige Objective C-Tutorials, und der folgende Code startet die Konsole in GDB-Modus

NSMutableArray *myObjects = [NSMutableArray array]; 
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three"]; 
NSArray *theKeys = [NSArray arrayWithObjects:@"A",@"B",@"C"];  
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys]; 
[myObjects addObject:theDict]; 

for(id item in myObjects) 
{ 
    NSLog(@"Found an Item: %@",item); 
} 

Wenn ich ersetzen die schnelle Auszählung Schleife mit einem traditionellen Zählschleife

int count = [myObjects count]; 
for(int i=0;i<count;i++) 
{ 
    id item; 
    item = [myObjects objectAtIndex:i]; 
    NSLog(@"Found an Item: %@",item); 
} 

Die Anwendung wird ohne Absturz ausgeführt und das Wörterbuch wird in das Konsolenfenster ausgegeben.

Ist dies eine Einschränkung der Fast Enumeration, oder fehlt mir etwas subtil von der Sprache? Gibt es andere Probleme beim Verschachteln solcher Sammlungen?

Für Bonuspunkte, wie konnte ich GDB verwenden, um dies selbst zu debuggen?

Antwort

10

Hoppla! arrayWithObjects: muss nicht terminiert sein. Der folgende Code funktioniert problemlos:

NSMutableArray *myObjects = [NSMutableArray array]; 
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three",nil]; 
NSArray *theKeys = [NSArray arrayWithObjects:@"A",@"B",@"C",nil];  
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys]; 
[myObjects addObject:theDict]; 

for(id item in myObjects) 
{ 
    NSLog(@"Found an Item: %@",item); 
} 

Ich bin mir nicht sicher, warum die Verwendung einer traditionellen Schleife diesen Fehler verbarg.

+0

Ah, einer meiner Lieblings-Cisms. "Das Ding, von dem Sie dachten, dass es richtig funktionierte, hätte nicht sein sollen". Danke für den Anfängerrat! –

+3

Wenn Sie -Wformat aktivieren ("Tycheck ruft in Xcode auf printf/scanf auf"), warnt der Compiler davor. Wenn Sie auch -Werror ("Behandle Warnungen als Fehler" in Xcode) aktivieren, wird der Compiler die Kompilierung über diesen Fehler fehlschlagen. –

+0

Danke Peter, sehr nützlich! –

Verwandte Themen