検索

ホームページ  >  に質問  >  本文

ios - 使用CoreData,对实体的基本类型属性赋值时出错

情形如下:一个用于记录工作任务的表,每条记录是一个任务。

首先创建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不知所云。求解此处为何报错?如何给基本类型属性赋值?

捞捞

高洛峰高洛峰2771日前382

全員に返信(1)返信します

  • 怪我咯

    怪我咯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;

    プリミティブ データ型を使用する場合、スカラーに対してアクセス メソッドを自動的に生成できないため、手動で記述する必要があるようです。そうしないとエラーが報告されます。

    返事
    0
  • キャンセル返事