2013-05-08 59 views
0

我有一個基於NSInMemoryStoreType存儲的核心數據堆棧。而且我注意到,刪除對象並不能真正刪除它們或使它們成爲零,而只是簡單地將它們變成錯誤。從內存中刪除核心數據對象將它們轉換成錯誤但不會將它們擦除

例如,(MyManagedObjectEntityClass以及所述<>標識符是佔位符)

MyManagedObjectEntityClass *o = [NSEntityDescription insertNewObjectForEntityForName:@"<MyManagedObjectEntityClass Entity Name>" 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,但所有對象仍然存在故障)。

所以我想知道是否有可能,或者我可以採取什麼替代方法來測試對象已被刪除的方式是透明的,他們是管理對象。

+0

您是否嘗試過使用'[o isDeleted]'進行測試? – 2013-05-09 05:56:58

+0

事情是這樣讓我和isFault在同一條船上。對象本身從上下文中刪除。如果我在刪除後執行提取請求,則上下文不返回任何匹配。問題在於,對於保存在客戶端代碼中的對象的任何引用(例如視圖控制器中的NSArray,例如,持有一堆託管對象)在刪除後仍然在集合中,即使它們是故障,它們仍然是對象我測試nil或測試集合的數量。 – SaldaVonSchwartz 2013-05-09 10:27:07

+0

這可能是我試圖使用託管對象的方式超出了核心數據的範圍。我在想也許是寫一個類或者繼承這些集合,讓它們知道託管對象,但它可能是超效率的。 – SaldaVonSchwartz 2013-05-09 10:28:01

回答

1

這其實不是核心數據問題。 C(以及Objective-C的擴展)不能像那樣工作。

deleteObject:方法帶有一個參數,一個指向對象的指針。它可以改變對象(比如設置它的isDeleted標誌),或者它可以完成與對象相關的其他事情(如從管理的對象上下文中刪除它)。它不能改變指針本身的值。因此無論它做了什麼或應該做什麼,C都會說,一旦完成,您傳入的指針仍然指向內存中的相同位置。因此,該方法實際上不可能強制該指針在該語言中爲零。如果你希望它是零,你必須自己改變它。 (順便說一下,實現方法可以實現一個指針參數的指針,它可以修改你的指針,但這對其他引用(如數組中的那些引用)沒有影響,所以它會是毫無意義)。

這就是爲什麼isDeleted方法是公共的,所以如果你在其他位置有一個指向這個對象的指針,你可以在嘗試使用它之前檢查它是否被刪除。

如果這不夠方便(通常不是),Core Data還提供了NSManagedObjectContextObjectsDidChangeNotificationNSManagedObjectContextDidSaveNotification。您可以在應用程序的任何位置使用這些內容以獲取有關上下文更改的通知,並以任何適當的方式進行響應(例如更新數組)。這些通知都試圖通過提供插入,更新和刪除對象的列表來幫助您。儘可能使用這些來檢查您是否確實需要更新您的參考。

+0

我知道C/obj-C與C++語義的區別。但是我想我正在考慮一個老式的C語言類型的東西。類似於'typedef struct int {int}}的行, } 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]); return 0; }'。謝謝! – SaldaVonSchwartz 2013-05-09 20:08:23

相關問題