Ich versuche, das NSFastEnumeration-Protokoll für eine SQLite-Abfrage zu implementieren.NSFastEnumeration-Nachricht an freigegebene Instanz gesendet
ich in leite: Nachricht an deallokierten Instanz
gesendet- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained *)stackbuf count:(NSUInteger)len {
// First call
if(state->state == 0) {
state->mutationsPtr = &state->extra[0];
state->state = 1;
sqlite3_reset(self.statement);
}
state->itemsPtr = stackbuf;
NSUInteger count = 0;
while (count < len) {
int result = sqlite3_step(self.statement);
if (result == SQLITE_DONE) {
break;
}
MyRow *row = [self queryRow];
stackbuf[count] = row;
count += 1;
}
return count;
}
-(MyRow *) queryRow {
MyRow * row = // query sqlite for row
return row;
}
Es scheint, als ob das ‚Reihe‘ Objekt nicht zurückgehalten werden, so dass, wenn es braucht in Schleife sein bereits freigegeben worden zugegriffen werden.
Muss ich die Ergebnisse speichern, wenn ich in 'countByEnumeratingWithState' in einem'strong'-Datensatz iteriere, so dass es beibehalten wird?
IE:
@property (nonatomic, strong) NSMutableArray *resultList;
dann innerhalb der while-Schleife:
while (count < len) {
int result = sqlite3_step(self.statement);
if (result == SQLITE_DONE) {
break;
}
MyRow *row = [self queryRow];
[self.resultList addObject:row]; // throw into a strong array so its retained
stackbuf[count] = row;
count += 1;
}
EDIT:
Ein wenig mehr Forschung zeigt, dass vielleicht nur __autoreleasing verwende ich kann:
MyRow * __autoreleasing row = [self queryRow];
Ohne ein starkes Array von Objekten verwalten zu müssen. Ist das die richtige Lösung?
Sie sollten Methoden nicht benennen 'erhalten ...'. Namenskonventionen haben in ARC eine Bedeutung. – Sulthan
@Sultan, behoben. Immer noch bleibt die Frage ... – lostintranslation