Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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_Multithreading_Core Data_Automatic Ref Counting_Nsthread - Fatal编程技术网

Ios 潜在的引用计数问题,除非在后台线程中获取新引用

Ios 潜在的引用计数问题,除非在后台线程中获取新引用,ios,multithreading,core-data,automatic-ref-counting,nsthread,Ios,Multithreading,Core Data,Automatic Ref Counting,Nsthread,如果可以的话,我在读了马库斯·S·萨拉的《优秀》(第二版)后有个问题 本书的异步添加NSPersistentStore部分包含以下代码(摘录): 它还包含以下解释: 我们重新引用 NSPersistentStoreCoordinator是一个安全问题。如果我们使用 引用外部方法时,我们将增加retain NSPersistentStoreCoordinator的计数,并可能导致 不必要的引用计数问题 这个潜在的引用计数问题的性质是什么 我理解,如果调度的块将引用作用域在外部的NSPersiste

如果可以的话,我在读了马库斯·S·萨拉的《优秀》(第二版)后有个问题

本书的异步添加NSPersistentStore部分包含以下代码(摘录):

它还包含以下解释:

我们重新引用
NSPersistentStoreCoordinator
是一个安全问题。如果我们使用 引用外部方法时,我们将增加retain
NSPersistentStoreCoordinator
的计数,并可能导致 不必要的引用计数问题

这个潜在的引用计数问题的性质是什么

我理解,如果调度的块将引用作用域在外部的
NSPersistentStoreCoordinator
,它将保留该协调器(将其引用计数增加1),只有在块完成执行后才能释放该协调器。如果后台线程从未执行或不会终止,则仍将存在引用计数问题

这就是问题的全部,还是有更微妙的情况也会构成引用计数问题,并可能在这种情况下实现


就目前情况而言,我不会(显著地)担心在这种特定情况下可能出现的引用计数问题(简单的后台操作,被分派用于立即执行),但可能我遗漏了一些东西。

在本例中,块本身可能执行得比较晚(许多其他代码可以在此块之前执行)。这意味着上下文或存储协调器可能会发生很多事情,假设存储协调器在块开始执行之前和之后都不是同一个对象

通过调用管理器检索协调器的新引用,您可以首先确保您将获得最新的协调器,并保持当前协调器未从块中恢复。如果要从块外重用协调器,则协调器将被保留并可能产生(尽管不太可能)内存膨胀之类的问题。如果一切都坏了,块甚至从未执行过,协调器就会永远保留,内存就会泄漏

这只是一个很好的实践。

所以我想这是“小心引用计数问题的开始”。
dispatch_queue_t queue;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

    // ...

    NSPersistentStoreCoordinator *coordinator = nil;
    coordinator = [[self managedObjectContext] persistentStoreCoordinator];

    // ...
});