尝试在第二次的NSManagedObject的子类中设置值时,我收到EXC_BAD_ACCESS错误。
我正在使用僵尸,但控制台中没有任何内容出现。使用GDB打印出对象我看到对象在我尝试设置值时都有相同的内存地址 - 不知道为什么会这样。
场合:
removeFromSuperView
被调用)在视图B的viewDidLoad
中,我总是尝试设置当前日期,以便跟踪用户“看到”该对象的时间。 这是我收到EXC_BAD_ACCESS错误的地方:
self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
其中self.currentPiece
是当数据库中存在该对象时附加在A中的子类NSManagedObject的实例。
我知道它正在某个地方发布,但我不知道自从托管对象自己处理大部分内容以来。该错误仅在我尝试设置值时第二次出现。
我试图明确这一点。请告诉我你是否希望我更多地澄清它。 感谢您的帮助(现在已经工作了几个小时)
更新
在HubPiece.h中声明piece_last_viewed:
@interface HubPiece : NSManagedObject {
}
// ...
@property (nonatomic, retain) NSNumber *piece_last_viewed;
HubPiece.m:
@dynamic piece_last_viewed;
//...inside init method:
self.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
更新2:
这不是由于子视图的切换,这被排除了。然后我意识到我也没有保存我的更改,所以我在子类NSManagedObject中引入了save:
。我第一次尝试保存实体实例(在应用程序会话期间保存,但是如果我完全退出应用程序,然后再次打开它,则数据消失),我得到了一个早期错误。所以我认为使用[context save:&error]
会是一个好主意:) ...但现在这不起作用并给我一个EXC_BAD_ACCESS错误。
HubPiece本身是从另一个类HubPieceView.m
初始化的:
self.currentPiece = [[HubPiece alloc] initWithXML:pieceXML];
self.currentPiece
是类型HubPiece
的类变量,它首先在.h文件中声明,然后在.m文件中合成。
然后在HubPiece.m
内,初始值设定项如下所示:
-(id)initWithXML:(TBXMLElement *)pieceXML
{
// Setup the environment for dealing with Core Data and managed objects
HenryHubAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityHubPiece = [NSEntityDescription entityForName:@"HubPiece"
inManagedObjectContext:context];
// STORING values
self = [[HubPiece alloc] initWithEntity:entityHubPiece insertIntoManagedObjectContext:context];
// ...setting variables with normal assignment: self.var = value;
NSError *error;
// Save fails
if (![context save:&error] ){
NSLog(@" ERROR: %@", [error localizedDescription]);
}
return self;
}
答案 0 :(得分:0)
我刚刚意识到自己的问题。我通过正常的'='赋值给实体赋值:
self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
什么时候应该完成:
[self setCurrentPiece.piece_last_viewed:[[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]] ];
这是因为它是一个托管对象,它通过@dynamic
编译器指令在运行时创建自己的访问器。