Ich verstehe, was der Fehler EXC_BAD_ACCESS
im Allgemeinen bedeutet, aber ich bin verwirrt darüber, was in meinem Fall passiert.EXC_BAD_ACCESS mit sortUsingComparator
Ich habe eine benutzerdefinierte Klasse, die eine NSComparator
Eigenschaft sortWithThisComparator
hat. Wenn diese Eigenschaft durch den Benutzer gesetzt ist, wenn ich einen Artikel in der Instanz der Klasse Eigenschafts-Array items
einfügen verwende ich den Komparator die Einfügeort zu bestimmen:
- (void) insertItem:(id<NSCoding, CKArchivingItem>) item {
if (arrayObjectClassString && ![item isKindOfClass:NSClassFromString(arrayObjectClassString)]) {
[NSException raise:@"YOU MADE A MISTAKE" format:@"you tried to insert a %@ but I can only accept %@", [item class], arrayObjectClassString];
} else {
if (!sortWithThisComparator) {
[self.items addObject:item];
} else {
NSInteger newItemIndex = [self.items indexOfObject:item inSortedRange:NSMakeRange(0, [self.items count]) options:NSBinarySearchingFirstEqual usingComparator:sortWithThisComparator];
if (newItemIndex >= [self.items count]) {
[self.items addObject:items];
} else {
[self.items insertObject:item atIndex:newItemIndex];
}
}
}
}
Alles funktioniert gut, wenn ich nicht setzen einen Komparator, aber wenn ich den Vergleicher verwende bekomme ich einen schlechten Zugriffsfehler:
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
...
[[CKGenericSingletonSubclass sharedManager] setSortWithThisComparator: ^NSComparisonResult(CKGeneralizedItemSubclass *i1, CKGeneralizedItemSubclass *i2) {
NSLog(@"we are inside");
NSLog(@"here is the item 1 %@", i1);
NSLog(@"we are comparing this float %f to thisf loat %f", i1.gradeSchoolAverage, i2.gradeSchoolAverage);
if (i1.gradeSchoolAverage < i2.gradeSchoolAverage) {
return NSOrderedAscending;
} else if (i1.gradeSchoolAverage == i2.gradeSchoolAverage) {
return NSOrderedSame;
} else {
return NSOrderedDescending;
}
}];
ich einen schlechten Zugang Thread in der zweiten Zeile des Komparator, der einfach ist einer der Parameter über den NSComparator bestanden anzumelden. Aber die Klasseninstanzen, die ich an die insertItem
übergebe, sind woanders ohne dieses Problem zugänglich, so dass ich weiß, dass sie ordnungsgemäß instanziiert wurden und ansonsten ordnungsgemäß übergeben werden, da ich sie ohne einen Komparator in die items
Eigenschaft einfügen kann. Was fehlt mir hier?
Weitere Details. Ich bin Speichern der NSComparator als
@property (strong, atomic) NSComparator sortWithThisComparator;
Wie speichern Sie den Block als eine Eigenschaft? Kannst du es zur Frage hinzufügen, auch Setzerimplementierung falls vorhanden. – Alistra
@ Alistra Ich habe keinen expliziten Setter geschrieben, sondern setze diese Eigenschaftseigenschaft (strong, atomic) NSComparator sortWithThisComparator; – sunny