これはCoreDataのバグだと思っていますが、バグレポートを提出する前に、私が愚かであるだけではないことを確認したいと思います。
5つの異なるCoreDataエンティティのデータにアクセスするようにNSOutlineViewを設定しました。各エンティティのデータには、エンティティとその'ManagedObjectContextにバインドされている異なるNSArrayControllerを使用してアクセスします。次に、NSOutlineViewDataSourceメソッドに、展開されたエンティティに応じて正しいNSStringオブジェクトを返すようにします。
注:エンティティは、エンティティの名前を持つNSArrayとして他の場所で宣言されます。
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index
ofItem:(id)item {
if(nil == item) {
return [entities objectAtIndex:index];
}
NSInteger entityIdx = [entities indexOfObject:item];
if (entityIdx == NSNotFound) {
return @"";
}
id returnObject = @"";
switch (entityIdx) {
case 0: {
Person *person = [[peopleArrayController arrangedObjects] objectAtIndex:index];
returnObject = person.fullName;
break;
}
case 1: {
Media *media = [[mediaArrayController arrangedObjects] objectAtIndex:index];
returnObject = media.imageTitle;
break;
}
case 2: {
Note *note = [[notesArrayController arrangedObjects] objectAtIndex:index];
returnObject = note.noteDescription;
break;
}
case 3: {
Source *source = [[sourcesArrayController arrangedObjects] objectAtIndex:index];
returnObject = source.title;
break;
}
case 4: {
Repository *repo = [[repostioriesArrayController arrangedObjects] objectAtIndex:index];
returnObject = repo.name;
break;
}
default:
break;
}
return returnObject;
}
PersonエンティティプロパティfullNameとMediaエンティティプロパティimageTitleはカスタムアクセサーです。
- (NSString *)fullName {
[self willAccessValueForKey:@"surName"];
[self willAccessValueForKey:@"givenName"];
NSString *firstName = [self valueForKey:@"givenName"];
NSString *lastName = [self valueForKey:@"surName"];
NSString *string = [NSString stringWithFormat:@"%@ %@", (firstName) ? firstName : @"", (lastName) ? lastName : @""];
[self didAccessValueForKey:@"surName"];
[self didAccessValueForKey:@"givenName"];
return string;
}
- (id) imageTitle {
[self willAccessValueForKey:@"path"];
id title = [[self valueForKey:@"path"] lastPathComponent];
[self didAccessValueForKey:@"path"];
return title;
}
PersonまたはMediaエンティティを展開しようとするとプログラムがクラッシュしましたが、他のエンティティを展開しようとするとクラッシュしませんでした。クラッシュを[NSCell_setContents:] [NSObject(NSObject)doesNotRecognizeSelector:]まで追跡しました
返されるMediaプロパティを標準のCoreDataアクセサープロパティ@"path"に変更しましたが、Mediaエンティティを展開するとプログラムのクラッシュが停止しました。したがって、問題は間違いなくカスタムアクセサーに関連しています。
参考までに-エンティティがNSManagedObjectクラスを使用するように設定されていることを確認しました。
バグ以外のクラッシュの理由を教えてもらえますか?