ich diese Antwort gefunden: wirdWie in Schleife intern arbeitet - Objective C - Stiftung
https://stackoverflow.com/a/5163334/1364174
Welche präsentiert wie for in
Schleife implementiert.
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
[obj doSomething];
}
}
Das Problem ist, dass ich es falsch gefunden habe.
Zunächst einmal, wenn Sie die automatische Referenzzählung haben (ARC) eingeschaltet, Sie haben einen Fehler
Sending '__strong id *' to parameter of type '__unsafe_unretained_id*' changes retain/release properties of pointer
Aber selbst wenn ich ARC ausschalten ich herausgefunden, dass ich __object Array scheint seltsam zu verhalten:
Dies ist eigentlicher Code (I MAX_STACKBUFF_SIZE angenommen 40 zu sein):
@autoreleasepool {
NSArray *myArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
int MAX_STACKBUFF_SIZE = 40;
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
__enumState.itemsPtr
NSLog(@" Object from __objects ! %@", obj); // on screenshot different message
}
}
}
return 0;
ich EXC_BAD_ACESS bekam, wenn ich versuche, den Inhalt des __object Array zu erhalten. Ich fand auch heraus, dass wenn Sie versuchen, durch __enumState.itemsPtr iterieren, es tatsächlich funktioniert.
Können Sie mir erklären, was hier vor sich geht? Warum scheint mein __objects
"geschrumpft" zu sein. Und warum enthält es nicht das gewünschte Objekt? Und warum ist dieser Fehler, wenn ARC eingeschaltet ist.
Vielen Dank im Voraus für Ihre Zeit und Mühe! (Ich habe Screenshot zum besseren Verständnis, was einen Fehler verursacht)
Ich verstehe es nicht, warum nicht einfach 'for in ___' verwenden? –
@ 0x7fffffff Ich versuche die Implementierung von 'for in' zu verstehen. –
@bluesm Den Code in dieser Antwort nicht wörtlich nehmen. Es ist bestenfalls Pseudocode *. Es ist fast sicher nicht, wie die Ersteller des Compilers die Schleife implementiert haben. –