나는 실제 사건이 아닌 사건이 진행될 순서의 예라고 생각한다.
우연히 ManagedObjectContext에 NSUndoManager를 제공하는 것을 잊었습니까?
저는 OS X에서 기본적으로 하나를 얻을 수 있다고 생각하지만, iOS에서는 특별히 제공해야합니다.
는 그런 다음 여러 MOCS를 사용하고, 실행 취소 - 관리자가이 작업을 수행 한 후, 전무 경우
managedObjectContext.undoManager = [[NSUndoManager alloc] init];
... 당신이 당신의 MOC를 만들 때 실행 취소 관리자를 설정해야 할, 또는 다른 코드가 다시 설정했습니다.
또한 디버깅을 위해 appointment.managedObjectContext 속성을 확인하고 nil이 아니며 유효한 MOC를 참조하는지 확인하십시오.
편집
좋아, 난 그냥 가서 간단한 모델을 사용, 빠른 테스트를 썼다. 어쩌면 당신은 당신의 주장이 실패하는 곳을보기 위해 비슷한 것을해야한다. (코드 경로에 보통의 assert를 추가 할 수있다. 나는 단위 테스트를하기 때문에 기존 프로젝트에 쉽게 추가 할 수있다.)
- (void)testUndoManager
{
NSDate *now = [NSDate date];
NSManagedObjectContext *moc = [self managedObjectContextWithConcurrencyType:NSConfinementConcurrencyType];
STAssertNil(moc.undoManager, @"undoManager is nil by default in iOS");
moc.undoManager = [[NSUndoManager alloc] init];
[moc.undoManager beginUndoGrouping];
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:EVENT_ENTITY_NAME inManagedObjectContext:moc];
STAssertNotNil(moc, @"Managed Object is nil");
STAssertEquals(moc, object.managedObjectContext, @"MOC of object should be same as MOC");
STAssertNotNil(object.managedObjectContext.undoManager, @"undoManager of MOC should not be nil");
[object setValue:now forKey:@"timestamp"];
STAssertEqualObjects(now, [object valueForKey:@"timestamp"], @"Timestamp should be NOW");
[moc.undoManager endUndoGrouping];
STAssertEqualObjects(now, [object valueForKey:@"timestamp"], @"Timestamp should be NOW");
[moc.undoManager undo];
STAssertNil([object valueForKey:@"timestamp"], @"Object access should be nil because changes were undone");
}
EDIT
관리 객체의 MOC 여러 조건 전무로 설정 될 수있다. 예를 들어 객체를 삭제 한 다음 모드를 저장하는 경우, 상무부는 ... 그 객체의 전무로 설정됩니다
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"SomeEntity" inManagedObjectContext:moc];
[object.managedObjectContext deleteObject:object];
[moc save:0];
// object.managedObjectContext will be nil
또 다른, 덜 일반적인 경우지만, 기호 메모리가있을 수 있음 MOC 관련 문제 ... ARC에서 관리 대상 객체의 MOC는 취약한 포인터입니다. 따라서 MOC가 사라지면 해당 포인터가 nil로 재설정됩니다. ARC가 아닌 경우 포인터는 이전 값을 가지며 결과는 정의되지 않습니다 ... 충돌이 발생할 수 있습니다.
그래서 managedObject 인 경우.managedObjectManager는 무기 호입니다, 가장 가능성이 범인은 다음과 같습니다 객체가 MOC
개체에 삽입되지 않았다
- MOC
- 상무부는
예입니다. 실제로 setUndoManager를했지만 여전히이 작업을 수행 한 후에 null로 남아 있습니다. – Bot
문서에 iOS에서 명시 적으로 실행 취소 관리자를 제공해야한다는 내용의 참조가 있습니까? –
OK 동료가 참조를 찾았습니다. https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506663-undomanager –