2013-04-05 79 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