2013-04-05 22 views
1

目前,我正在開發一款預訂汽車的應用程序。所有與預訂相關的數據都存儲在實體「預訂」中。由於「預訂」或「預訂」與其他實體之間的關係的某些屬性是強制性的,我決定將實體「預訂」的所有managedObjects添加到他們自己的managedObjectContext中。這個上下文也將存儲在一個單獨的變量中以避免丟失。這工作正常,除非我會簽署(企業商店或adhoc)我的應用程序並部署它。 ARC已啓用。爲什麼未保存的managedObject會丟失其managedObjectContext

類預訂界面

@interface Bookings : NSManagedObject { 
@private 
    NSManagedObjectContext *mContext; 
} 

@end 

類黃牌實施

@implementation Bookings { 

    + (Bookings *)booking { 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]; 
     [context setPersistentStoreCoordinator:[self persistentStoreCoordinator]]; 

     Bookings *object = (Bookings*)[[NSManagedObject alloc] initWithEntity:[self entityForName:pName] insertIntoMarenagedObjectContext:context]; 
     [object setSomeReservationData:...]; 
     ... 

     // here I store the context in an ivar of my booking object 
     [object->mContext = context]; 

     return object; 
    } 
} 

在這種狀態下,預定對象不會被保存!

類BookingsVC

Bookings *booking = [Bookings booking]; 
NSLog(@"Context: %@", [booking managedObjectContext]); 

沒有保存或改變,但是情況下是空的。

上設備

... Context: (null) 

上模擬器或設備(自組織簽署但安裝通過的Xcode)控制檯輸出

... Context: <NSManagedObjectContext: 0x893c520> 
(自組織通過iPhone-配置或Testflight簽署並展開) 控制檯輸出

那麼爲什麼一個未保存的managedObject會丟失它的managedObjectContext,這怎麼可以避免呢?這是一個錯誤還是預期的行爲?

+0

如何聲明'mContext'? – 2013-04-05 18:34:59

+0

它被聲明爲'NSManagedObjectContext * mContext'。我會更新我的問題。 – lindinax 2013-04-10 21:57:13

回答

1

您的上下文在函數結束時被取消。 see here
您的對象被上下文賦予它的所有屬性爲空,在調試模式下,存在一個autorelease池來保持上下文不被釋放。

+0

感謝您的鏈接。沒有聽說過調試/發佈的差異。但是我看不出與我的問題有任何關係,因爲報告的行爲(無效或零值)與我的問題不匹配。爲了避免丟失我的對象的上下文,我決定將它存儲在伊娃裏。因此,最終不應該是retainCount 1(分配+1,分配+1,釋放-1)。 – lindinax 2013-04-10 22:22:20