objective c - EXC_BAD_ACCESS on setting Core Data entity property -


i've seen problems people using integer type in core data model, trying use integers in code while not setting checkbox use scalars. but, i'm doing that.

  1. create integer 64 property on entity
  2. create nsmanagedobject subclass entity
  3. check "use scalar properties primitive data types" box.

this generates:

@interface state : nsmanagedobject @property (nonatomic) int64_t serverid; @end

but, then, during runtime, i'll exc_bad_access error code:

int64_t somevalue = 313; state *state = ... // standard [nsentitydescription insert code state.serverid = somevalue;

where 'state' nsmanagedobject subclass, , serverid integer 64 property. but, following code works:

state.serverid = [nsnumber numberfromint:somevalue];

but, since serverid declared int64_t, results in warning. and, trying access value gives might pointer address (although %@ looks expect).

so, guess question is, in core data has gotten stuck on int64_t's being nsnumber's? looking @ model , nsattributedescription's, it's nsinteger64attributetype.

things think may have this:

  • forgetting check box, , regenerating class
  • updating schema , migrating

in first instance, seems common case, , i've tried this, and, expected, can't reproduce problem. second case, deleted model file , recreated everything, deleted deriveddata directory.

if plan support both 32 ad 64 bit architectures want stay away form scalars.

for start read cocoatouch 64 bit guide

in code pay attention int , nsinteger

in model use integer32 or integer64. bit size depending on app requirement number space. if serverid's around 313 should ok 32 bits, if have big number go integer64.

i understand use integer64. avoid need migration stick integer64 now. test app 32-bit architecture, too.

in entity class use nsnumber, don't use scalars attributes stored in storage.

@interface state : nsmanagedobject    @property (nonatomic, retain) nsnumber *serverid;  @end  @implementation state    @dynamic serverid;  // create default accessor @end 

coredata magic of converting integer32 or integer64 nsnumber , not need worry conversion warnings.

in app code use numberfrominteger not numberfromint

 state.serverid = [nsnumber numberfrominteger:somevalue]; 

custom accessors integer

if have lot of nsintegers , want write like

 nsinteger someinteger;  state.serveridinteger =  someinteger;  // or  someinteger = state.serveridinteger; 

then need custom accessor serverid. model not change, changes entity class.

@interface state : nsmanagedobject    @property (nonatomic, retain) nsnumber *serverid;     @property (nonatomic) nsinteger serveridinteger; //custom accessor @end  @implementation state @dynamic serverid;  // create default *serverid* accessor   // custom accessor -(void)setserveridinteger:(nsinteger)aninteger {    [self willchangevalueforkey:@"serverid"];    [self setserverid:[nsnumber numberwithinteger:aninteger]];    [self didchangevalueforkey:@"serverid"]; }  -(nsinteger)serveridinteger {     [self willaccessvalueforkey:@"serverid"];     nsnumber *tmpvalue = [self serverid];     [self didaccessvalueforkey:@"serverid"];     return (tmpvalue!=nil) ? [tmpvalue integervalue] : 0; }  @end 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -