iPhone アプリのコア データ プロパティのカスタム アクセサー メソッドに問題があります。プリミティブ型を取り出して返すだけではありません。可能性のある activityTypes の NSSet があり、オブジェクトの PrimitiveType がない場合は、そのセットを調べて、クラスの別の変数に一致する activityType を返します。
以下は、これを行うために思いついたコードです。コードの問題は、への呼び出しが[self willChangeValueForKey:@"type"]
無限ループにつながり、プログラムが NSLog を吐き出し続けることです。「型を ... に設定しています」-おそらく、アクセサー内から willChange を呼び出しているためですか?
を取り出して[self willChangeValueForKey:@"type"]
もループは発生せず、プログラムは正常に実行され、次にオブジェクトの型にアクセスしようとすると、プリミティブ型が正しく呼び出されます。ただし、ManagedObjectContext に保存する時間になったことを伝えると、どのオブジェクトにも変更がないことがわかります。したがって、willChangeValueForKey を呼び出していないため、primitiveType への変更はオブジェクトに対して永続化されません。
- (ActivityType *)type {
[self willAccessValueForKey:@"type"];
ActivityType *myType = [self primitiveType];
[self didAccessValueForKey:@"type"];
if (myType != nil) {
NSLog(@"Use primitive (%@)", [myType myDescription]);
} else {
// 1) find type
NSSet *types = self.myActivityTypes;
NSSet *foundTypes = [types objectsPassingTest:^BOOL(id obj, BOOL *stop) {
ActivityType *object = (ActivityType *) obj;
return ([object.typeName isEqualToString:self.activityTypeName]);
}];
myType = [foundTypes allObjects][0];
NSLog(@"Setting type to %@", [myType myDescription]);
// in this case we should not alert anyone since we are inside the getter?
[self willChangeValueForKey:@"type"];
[self setPrimitiveType:myType];
[self didChangeValueForKey:@"type"];
}
return myType;
}