我对核心数据编程和Cocoa很新,所以难怪我遇到了麻烦:)
所以这是我的managedObjectModel方法:
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil)
{
return managedObjectModel;
}
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
NSAssert(modelURL != nil,@"modelURL == nil");
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel;
}
以下是代码崩溃的部分:
NSManagedObjectModel *mom = [self managedObjectModel];
managedObjectModel = mom;
if (applicationLogDirectory() == nil)
{
NSLog(@"Could not find application logs directory\nExiting...");
exit(1);
}
NSManagedObjectContext *moc = [self managedObjectContext];
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
NSEntityDescription *newShotEntity = [[mom entitiesByName] objectForKey:@"Entity"];
Entity *shEnt = [[Entity alloc] initWithEntity:newShotEntity insertIntoManagedObjectContext:moc];
shEnt.pid = [processInfo processIdentifier]; // EXC_BAD_ACCESS (code=1, address=0x28ae) here !!!
NSError *error;
if (![moc save: &error])
{
NSLog(@"Error while saving\n%@",
([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
exit(1);
}
我真的很困惑,为什么我有这个错误,因为当我硬编码数据模型而不是使用.xcdatamodeld文件时它工作得很好!
非常感谢任何形式的帮助!
编辑1:因为我提出了所有这些问题,所以我想让一切都清楚,抱歉没有提供所有这些。
// Entity.h
#import <CoreData/CoreData.h>
@interface Entity : NSManagedObject
@property (strong) NSDate *date;
@property (assign) NSInteger pid;
@end
//Entity.m
#import "Entity.h"
@interface Entity ()
@property (strong) NSDate *primitiveDate;
@end
@implementation Entity
@dynamic date,primitiveDate,pid;
- (void) awakeFromInsert
{
[super awakeFromInsert];
self.primitiveDate = [NSDate date];
}
- (void)setNilValueForKey:(NSString *)key
{
if ([key isEqualToString:@"pid"]) {
self.pid = 0;
}
else {
[super setNilValueForKey:key];
}
}
@end
答案 0 :(得分:1)
在核心数据中使用标量值比使用推荐的NSNumber
要多一些工作。这在核心数据编程指南的this section中有详细描述。
我强烈建议您将此属性切换为NSNumber。您的任务说明将是:
shEnt.pid = [NSNumber numberWithInt:[processInfo processIdentifier]];