Iphone Can';两次设置成员变量(NSManagedObject)
第二次尝试在NSManagedObject的子类中设置值时,我遇到EXC_BAD_访问错误 我正在使用僵尸,但控制台中没有显示任何内容。使用GDB打印出该对象时,我在尝试设置该值的两次操作中都看到该对象具有相同的内存地址,但不确定原因 情况:Iphone Can';两次设置成员变量(NSManagedObject),iphone,objective-c,memory-management,nsmanagedobject,Iphone,Objective C,Memory Management,Nsmanagedobject,第二次尝试在NSManagedObject的子类中设置值时,我遇到EXC_BAD_访问错误 我正在使用僵尸,但控制台中没有显示任何内容。使用GDB打印出该对象时,我在尝试设置该值的两次操作中都看到该对象具有相同的内存地址,但不确定原因 情况: self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]]; 我有一个视图(a),当扫
self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
removeFromSuperView
被调用)viewDidLoad
中,我总是尝试设置当前日期,以便跟踪用户何时“看到”该对象这是我得到EXC\u BAD\u访问错误的地方:
self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
其中,self.currentPiece
是在数据库中存在子类NSManagedObject时附加到的子类NSManagedObject的实例
我知道它是在某个地方发布的,但我不知道在哪里,因为托管对象自己负责大部分工作。该错误仅在我尝试设置该值的第二次出现
我已经试图把这一点讲清楚。如果你想让我进一步澄清,请告诉我。
感谢您的帮助(已经为此工作了几个小时)
更新:
声明最后一次在Hubbice.h中查看的片段:
@interface HubPiece : NSManagedObject {
}
// ...
@property (nonatomic, retain) NSNumber *piece_last_viewed;
Hubbece.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\u BAD\u访问错误
轮毂本身是从另一个类初始化的hubbieview.m
:
self.currentPiece = [[HubPiece alloc] initWithXML:pieceXML];
self.currentPiece
是hubbece
类型的类变量,它首先在.h文件中声明,然后在.m文件中合成
然后在hubbece.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;
}
我刚刚意识到我的问题。我一直在通过正常的“=”赋值为实体赋值:
self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
应在何时完成:
[self setCurrentPiece.piece_last_viewed:[[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]] ];
这是因为它是一个托管对象,在运行时通过@dynamic
编译器指令创建自己的访问器。在第二次按B之前,currentPiece的值是否正确填充且完整?最后一次查看是如何申报的?在按下视图B之前,您是否可以设置最后一次查看的工件(只是为了尝试将视图B隔离为问题的根源。)谢谢您的评论,我在按下B键之前设置了它,但没有任何帮助,所以我现在将其隔离为在不允许的情况下设置变量。如何声明工件上次查看?在设置工件上次查看和第二次查看之间是否存在获取或保存操作,或者您只是在使用最初获取的轮毂?另外,为什么要使用NSNumber而不是NSDate?核心数据确实有一个日期字段,所以您可以只使用myEntity.myDateField=[NSDate date];以捕获当前日期。