情形如下:一个用于记录工作任务的表,每条记录是一个任务。
首先创建xcdatamodeld文件,包括:
name:【String】:任务名称
timetodo:【Double】:计划完成耗时
isValid:【Integer 16】:完成状况
enddate:【Date】:完成日期
等等,类型仅限上面四种。
从菜单生成NSManagedObject文件,属性:
@property (nullable, nonatomic, copy) NSDate *enddate;
@property (nonatomic) double timetodo;
@property (nonatomic) int16_t isvalid;
@property (nullable, nonatomic, copy) NSString *name;
等等,以及@dynamic。
实际使用中发现,在任何地方对timetodo、isvalid赋值都报错,其他属性正常,例如
theTask.timetodo = [dic[@"did"] doubleValue];
theTask.timetodo = 1.0;
[theTask setTimetodo:1.0];
执行到此句,都报EXC_BAD_ACCESS异常:error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).
查了相关的问题,有说property必须是Objective C的对象类型的,基本类型的字段自动生成属性会变成NSNumber,也有说在ios新版中可以自动类型转换balabala不知所云。求解此处为何报错?如何给基本类型属性赋值?
捞捞
怪我咯2017-04-18 09:55:11
ご自身で調べてください。リンク
Core Data は、整数、浮動小数点、ブール型などの多くの一般的なデータ型をサポートしますが、データ モデル エディターはデフォルトでこれらのプロパティを NSNumber として生成し、管理オブジェクトのサブクラスに組み込まれます。このため、プログラム コードでは floatValue、boolValue、integerValue などの NSNumber メソッドを頻繁に使用することになります。ただし、右側の [属性] で [スカラー型を使用] を選択することで、これらの属性を int64_t、float_t、BOOL などの目的のスカラー型に直接設定することもできます。
これにより、NSManagedObject (スカラー プロパティを使用したプリミティブ データ型) が生成されます。これは次のようにはなりません。
@property (非アトミック、強力) NSNumber *myInteger;
は次のステートメントに置き換えられます:
@property (非アトミック) int64_t myInteger;
プリミティブ データ型を使用する場合、スカラーに対してアクセス メソッドを自動的に生成できないため、手動で記述する必要があるようです。そうしないとエラーが報告されます。