情形如下:一个用于记录工作任务的表,每条记录是一个任务。
首先创建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不知所云。求解此处为何报错?如何给基本类型属性赋值?
捞捞
Cari pemahaman anda sendiri. Pautan
Data Teras menyokong banyak jenis data biasa termasuk integer, titik terapung dan jenis Boolean, tetapi editor model data menjana sifat ini sebagai NSNumber secara lalai dan dibina ke dalam subkelas objek terurus. Ini menjadikan kami sering menggunakan kaedah NSNumber seperti floatValue, boolValue, integerValue, dll. dalam kod program. Tetapi kita juga boleh menetapkan secara langsung atribut ini kepada jenis skalar yang dikehendaki, seperti int64_t, float_t atau BOOL, dengan memilih Gunakan Jenis Skalar dalam Atribut di sebelah kanan.
Ini menjana NSManagedObject (jenis data primitif menggunakan sifat skalar), yang tidak akan kelihatan seperti:
@harta benda (nonatomik, kuat) NSNumber *myInteger;
akan digantikan dengan pernyataan berikut:
@property (nonatomic) int64_t myInteger;
Nampaknya apabila menggunakan jenis data primitif, kaedah akses tidak boleh dijana secara automatik untuk skalar dan perlu ditulis secara manual, jika tidak ralat akan dilaporkan.