찾다

 >  Q&A  >  본문

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일 전384

모든 응답(1)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-18 09:55:11

    직접 알아보세요. 링크

    Core Data는 정수, 부동 소수점 및 부울 유형을 포함한 많은 일반적인 데이터 유형을 지원하지만 데이터 모델 편집기는 기본적으로 이러한 속성을 NSNumber로 생성하고 관리 개체 하위 클래스에 내장됩니다. 이로 인해 프로그램 코드에서 floatValue, boolValue, IntegerValue 등과 같은 NSNumber 메서드를 자주 사용하게 됩니다. 그러나 오른쪽 속성에서 Use Scalar Type을 선택하여 이러한 속성을 int64_t, float_t 또는 BOOL과 같은 원하는 스칼라 유형으로 직접 설정할 수도 있습니다.

    이렇게 하면 NSManagedObject(스칼라 속성을 사용하는 기본 데이터 유형)가 생성되는데 더 이상 다음과 같지 않습니다.

    @property(비원자적, 강력함) NSNumber *myInteger;

    은 다음 문장으로 대체됩니다.

    @property(비원자) int64_t myInteger;

    기본 데이터 유형을 사용할 때 스칼라에 대한 액세스 방법을 자동으로 생성할 수 없으며 수동으로 작성해야 하는 것 같습니다. 그렇지 않으면 오류가 보고됩니다.

    회신하다
    0
  • 취소회신하다