Ios NSManagedObject是否自动保存某些属性?

Ios NSManagedObject是否自动保存某些属性?,ios,core-data,Ios,Core Data,我有一个NSFetchedResultsController,我用它填充UITableView,其中包含一些保存的NSManagedObjects(每个都有一个NSMutableAttributedString属性)。用户选择单元格后,我检索相应的NSManagedObject,将其传递给下一个视图控制器,并将NSFetchedResultsController设置为nil。在下一个视图控制器上,我编辑了NSManagedObject的NSMutableAttributedString,并且不保

我有一个
NSFetchedResultsController
,我用它填充
UITableView
,其中包含一些保存的
NSManagedObjects
(每个都有一个
NSMutableAttributedString
属性)。用户选择单元格后,我检索相应的
NSManagedObject
,将其传递给下一个视图控制器,并将
NSFetchedResultsController
设置为nil。在下一个视图控制器上,我编辑了
NSManagedObject
NSMutableAttributedString
,并且不保存它。这是我的问题,如果我现在返回到上一个视图控制器,并从同一单元格中重新选择相同的
NSManagedObject
,则
NSMutableString
仍具有与我之前所做的相同编辑。有人知道这是为什么吗?我如何预防?一些代码片段:

在我的应用程序代理中:

- (NSString *) saveContext
{
    NSManagedObjectContext *context = [self managedObjectContext];

    NSError *error;

    if (![context save:&error])
    {
        return [error localizedDescription];
    }
    else
    {
        return nil;
    }
}
具有
UITableView
fetechedResultsController
的视图控制器:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSError *error;

    if (![[self fetchedResultsController] performFetch:&error])
    {
        exit(-1);
    }
}


    - (void)viewDidUnload
    {
        self.fetchedResultsController = nil;
    }

    - (NSFetchedResultsController *)fetchedResultsController
    {
        if (_fetchedResultsController != nil)
        {
            return _fetchedResultsController;
        }

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"ComicInfo" inManagedObjectContext:[self.appDelegate managedObjectContext]];
        [fetchRequest setEntity:entity];

        NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"lastSaved" ascending:NO];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

        [fetchRequest setFetchBatchSize:9];

        NSFetchedResultsController *theFetchedResultsController =
        [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                            managedObjectContext:[self.appDelegate managedObjectContext] sectionNameKeyPath:nil
                                                       cacheName:nil];
        self.fetchedResultsController = theFetchedResultsController;
        _fetchedResultsController.delegate = self;

        return _fetchedResultsController;

    }

NSFetchedResultsController实际上并没有保存任何内容。NSManagedObjectContext保存(或更改)内容。即使创建了新的NSFetchedResultsController,也会将其与相同的NSManagedObjectContext重新关联:

...inManagedObjectContext:[self.appDelegate managedObjectContext]]
因此,请这样想:托管对象具有其所有更改。。好。。由NSManagedObjectContext管理。如果使用相同的NSManagedObjectContext创建新的NSFetchedResultsController,则对该托管对象的任何请求都将是相同的(无论是否保存,除非您已关闭该应用)


换句话说,当应用程序仍在运行时,NSManagedObjectContext将在被请求时返回内存中的同一托管对象。。。即使它与新的NSFetchedResultsController关联。储蓄是一项完全不同的活动。保存对象意味着即使其环境已关闭,它仍将处于活动状态。但在本例中,您并没有关闭环境(NSManagedObjectContext)。作为测试,您可以尝试这样做:让第二个VC对托管对象进行更改,但在您返回第一个VC之前杀死应用程序(而不仅仅是挂起)。然后重新启动应用程序,我打赌你不会看到所做的任何更改(因为你没有保存它)

如果原始NSManagedObjectContext与零的NSFetchedResultsController重新关联,则将返回托管对象。我猜这就是答案,但在我提交之前想看看一些代码。@JShapiro-我提供了一些代码。即使如此,如果我不保存上下文,它如何仍然保存NSMutableAttributedString?有趣的是,它只选择了那个,而忽略了保存其他东西。谢谢!这是有道理的。因此,我猜解决方案是在我用tableview加载第一个视图控制器时,首先将NSManagedObjectContext设置为nil?如果您不希望第二个VC更改原始托管对象,请制作一个副本:[obj copy]并使用它。