2015-05-01 2 views
0

Все,Неверное значение в NSNumber, CFNumberType не определен

Я создал DataModel с 3 поля:
- тип beingPlayed int16
- позиционного типа int16
- типа playedBy int16

I создали для него класс.
Tile.h

@property (nonatomic, retain) NSNumber * beingPlayed; 
@property (nonatomic, retain) NSNumber * playedBy; 
@property (nonatomic, retain) NSNumber * position; 

Tile.m

@dynamic beingPlayed; 
@dynamic playedBy; 
@dynamic position; 

Я предположил бы, что все 3 переменные NSNumbers и имеют Int16 типа (CFNumberType = kCFNumberSInt16Type).

Когда я создаю объект Tile, я установил все параметры 0 с [NSNumber numberwithint:0]

Но когда я хочу, чтобы установить другое значение для этого объекта, тип beingPlayed не установлен и поэтому значение не является правильным.

Я использовал:

self.beingPlayed = self.playedBy = self.position = [NSNumber numberWithInt:175]; 

Результат:
позиция = 175
playedBy = 175
beingPlayed = -81

Я использовал:

self.playedBy = self.position = [NSNumber numberWithInt:175]; 
self.beingPlayed = self.position; 

Результат:
позиция = 175
playedBy = 175
beingPlayed = -81

Когда я отладки, я вижу, что:
- позиция имеет тип kCFNumberSInt16Type
- playedBy имеет тип kCFNumberSInt32Type
- arePlayed имеет NO тип ....

Что такое goi ng здесь? Где я могу установить тип или где установлен тип?
Моя проблема в том, что теперь это нормальный int, который может содержать только значения < 127, но я установил тип в datamodel для int16 ....

Edit:

Дополнительный код из OP из комментариев:

Tile *newTile = [NSEntityDescription 
    insertNewObjectForEntityForName:@"Tile" inManagedObjectContext:context]; 
newTile.playedBy = @(129); 
newTile.position = @(129); 
newTile.beingPlayed = @(129); 
[context save:&error]; 

Logging: playedBy = -127, положение = 129 и beingPlayed = 129

+0

Попробуйте NSNumber * myNumber = [Номер NSNumberWithLongLong: [tmpId longLongValue]]; – Rahul

+0

Видимо, вы проверяете что-то совершенно другое. Присвоение указателей не копирует базовые объекты. 'self.playedBy = self.position' означает, что эти два свойства указывают на ** тот же самый объект ** в памяти. Они не могут * * иметь разные типы (или любые другие атрибуты). –

+0

Не пытайтесь использовать 'NSNumber' вообще; вам это нужно только при хранении чисел в классе коллекции и всего лишь накладные расходы везде. – trojanfoe

ответ

1

Вот что вы необходимо понять: созданные NSManagedObject подклассы используют объекты для всех чисел, а чем примитивов. Также возможно использовать примитивы, но есть некоторые преимущества в том, чтобы оставлять вещи так, как их создает редактор Xcode.

Короче вам нужно понять, что объект в C является указателем на этот объект. Значит, значение этого Указателя не имеет отношения к вашему морю. SDK предоставляет очевидные методы для обертывания и разворачивания объектов NSNumber.

// set 
position = @3994; 

// get 
NSInteger p1 = position.integerValue; 
int  p2 = position.intValue; 
BOOL  p3 = position.boolValue; 

// modify 
position = @(position.integerValue + 1); 

// compare 
position.integerValue == position2.integerVaue // true if equal 

Ваши прикованы задания не работают из-за различное значение = при работе с объектами против ценностей.

NSNumber *x, *y; 
x = @1; // assign value to x 
y = x; // y points to x 

Кроме того, убедитесь, что вы не отвергая любые методы получения или сеттеров, которые потенциально могли бы также изменить результат.

+0

Привет @Mundi, спасибо за объяснение. Я понимаю концепцию объектов и указателей. Итак, теперь я тестировал 'beingPlayed = @ (175)', но тогда значение снова равно -81. Когда я тестирую 'self.beingPlayed = [NSNumber numberWithInt: 175];' значение также равно -81.Когда я использую 'CFNumberType numberTypeBP = CFNumberGetType ((CFNumberRef) self.beingPlayed);', (после присвоения значения), я получаю ошибку EXC_BAD_ACCESS .... – RobertvdBerg

+0

Возможно, что вы не читаете значение правильно, или что вы меняете его перед чтением. – Mundi

+0

Еще до того, как я сохраню объект в контексте, данные хранятся неправильно в памяти. 'Tile * newTile = [NSEntityDescription insertNewObjectForEntityForName: @" Tile "inManagedObjectContext: context]; newTile.beingPlayed = @ (129); '=> value -127 – RobertvdBerg

0

«Кроме того, убедитесь, что вы не отвергая любые методы получения или сеттеры , которые потенциально могут также изменить результат.»

сделал трюк! У меня был метод (BOOL) isBeingPlayed, который также является частью реализации KVC, и поэтому один из сборщиков/геттеров ... Он соскользнул с ума.

И потому BOOL также INT в основной тип был преобразован в междунар вместо int16 ....

Спасибо всем за помощь!