Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从内存存储中删除核心数据对象会将它们转换为故障,但不会擦除它们_Ios_Cocoa_Core Data - Fatal编程技术网

Ios 从内存存储中删除核心数据对象会将它们转换为故障,但不会擦除它们

Ios 从内存存储中删除核心数据对象会将它们转换为故障,但不会擦除它们,ios,cocoa,core-data,Ios,Cocoa,Core Data,我有一个基于nsimemorystoretype存储的核心数据堆栈。我注意到,删除对象并不能真正删除它们或使它们为零,而只是将它们变成错误 例如,(MyManagedObjectEntityClass以及标识符都是占位符): MyManagedObjectEntityClass*o=[NSEntityDescription insertNewObjectForEntityForName:@“inManagedObjectContext:self.localContext]; NSLog(@“\n

我有一个基于
nsimemorystoretype
存储的核心数据堆栈。我注意到,删除对象并不能真正删除它们或使它们为零,而只是将它们变成错误

例如,(MyManagedObjectEntityClass以及标识符都是占位符):

MyManagedObjectEntityClass*o=[NSEntityDescription insertNewObjectForEntityForName:@“inManagedObjectContext:self.localContext];
NSLog(@“\n%@”,o);
[self.localContext-deleteObject:o];
NSLog(@“\n%@”,o);
将记录该对象仍然存在,但其数据是错误的

并添加
[self.localContext save:nil]也不会改变这一点

我希望在某个时候可以测试
o
变量的
nil
,在这种情况下,我会重新加载对象,但似乎我不能

以防万一,是的,我知道我可以改为测试
o
-isFault
。但问题是,将此测试外推到NSSet,我不能仅仅依靠
[[set anyObject]isFault]
来断定该集合中的所有对象都已删除(理想情况下,集合的计数为0,但所有对象仍作为故障存在)


因此,我想知道是否有可能,或者我可以采取什么替代方法来测试对象是否已被删除,以一种对它们是托管对象这一事实透明的方式进行测试。

这实际上不是一个核心数据问题。C(扩展到Objective-C)不是这样工作的

deleteObject:
方法接受一个参数,即指向对象的指针。它可以更改对象(如设置其
isDeleted
标志),也可以执行与对象相关的其他操作(如从其托管对象上下文中删除)。它无法更改指针本身的值。所以不管它做什么或者应该做什么,C表示一旦完成了,你传入的指针仍然指向内存中的同一个位置。因此,在这种语言中,该方法实际上不可能强制该指针为nil。如果你希望它为零,你必须自己改变它。(顺便说一句,我们可以实现一个方法来获取一个指针到指针的参数,这个参数可以修改您的指针。但是,这对其他引用(例如数组中的引用)没有影响,所以这有点毫无意义)

这就是为什么
isDeleted
方法是公共的,因此如果您在其他位置有指向此对象的指针,则可以在尝试使用它之前检查它是否已被删除


如果这不够方便(通常不是),核心数据还提供
NSManagedObjectContextObjectsDidChangeNotification
nsmanagedobjectcontextdiddavenotification
。您可以在应用程序中的任何位置使用这些命令来获得上下文更改的通知,并以任何适当的方式进行响应(例如,更新数组)。这些通知都试图通过提供插入、更新和删除对象的列表来帮助您。在可能的情况下使用这些工具来检查您是否确实需要更新您的参考资料。

您是否尝试过使用
[o isDeleted]
进行测试?这让我和isFault处于同一条船上。对象本身将从上下文中删除。如果在删除后执行提取请求,则上下文不会返回匹配项。问题在于,对客户机代码中保存的对象的任何引用(例如,视图控制器中的NSArray,包含一组托管对象)删除后仍在集合中,即使它们是错误,如果我测试nil或测试集合的计数,它们仍然是对象。这可能是因为我尝试使用托管对象的方式超出了核心数据的范围。我在想,也许可以编写一个类别或对集合进行子类化,以使它们了解托管对象,但这可能是非常低效的。阅读关于无法实现错误的内容我的问题实际上是C语义(按值)和您刚刚链接的核心数据的条件和行为的组合。谢谢你的指点!(没有双关语)我知道C/Obj-C与C++语义之间的区别。但我想我是从一种老式的C数组的角度来考虑的。类似于
typedef struct{int num;}obj;int main(){obj*a[3];a[0]=malloc(sizeof(obj));a[0]>num=55;printf(“\n%p”,a[0]);free(a[0]);a[0]=NULL;printf(“\n%p,a[0]);返回0;}
。谢谢
    MyManagedObjectEntityClass *o = [NSEntityDescription insertNewObjectForEntityForName:@"<MyManagedObjectEntityClass Entity Name>" inManagedObjectContext:self.localContext];
    NSLog(@"\n%@", o);
    [self.localContext deleteObject:o];
    NSLog(@"\n%@", o);