NSObjectInaccessibleException », причина:« CoreData не может выполнить ошибку

Согласно стандарту ISO C, когда вы преобразовываете целое число в подписанный тип, а значение выходит за пределы целевого типа, результат определяется реализацией. (Или сигнал, определяемый реализацией, может быть поднят, но я не знаю каких-либо компиляторов, которые это делают.)

На практике наиболее распространенным поведением является то, что старшие разряды отбрасываются. Таким образом, предполагая, что int - 32 бита, а short - 16 бит, преобразование значения 0x1248642, вероятно, даст бит-шаблон, который выглядит как 0x8642. Предполагая, что для подписанных типов (которые используются почти для всех систем) представление с двумя дополнениями, старший бит является знаковым битом, поэтому числовое значение результата будет -31166.

int y   =   sx;

Это также подразумевает неявное преобразование, от short до int. Поскольку диапазон int гарантированно покрывает по крайней мере весь диапазон short, значение не изменяется. (Так как в вашем примере значение sx оказывается отрицательным, это изменение представления скорее всего будет связано с расширением знака , распространяющим бит знака 1 на все 16 старших разрядов результата.)

Как я указал, ни одна из этих деталей не требуется по языковому стандарту. Если вы действительно хотите усечь значения до более узкого типа, лучше всего использовать неподписанные типы (которые имеют заданное по языку поведение wraparound) и, возможно, явные операции маскировки, например:

unsigned int x = 0x1248642;
unsigned short sx = x & 0xFFFF;

Если у вас есть 32-битное количество, которое вы хотите вставить в 16-битную переменную, первое, что вам нужно сделать, это решить, как вы хотите, чтобы ваш код работал, если значение не подходит. Как только вы это решите, вы можете понять, как писать код C, который делает то, что вы хотите. Иногда усечение происходит именно так, как вы хотите, и в этом случае ваша задача будет легкой, особенно если вы используете неподписанные типы. Иногда значение вне диапазона является ошибкой, и в этом случае вам нужно проверить его и решить, как обрабатывать ошибку. Иногда вам может потребоваться насыщение, а не усечение, поэтому вам нужно написать код для этого.

Знание того, как работают преобразования на C, но если вы запустите с этим вопросом, вы просто можете приблизиться к своей проблеме с неправильного направления.

8
задан Charles 12 January 2013 в 19:30
поделиться

1 ответ

Вы могли дать попытку использовать:

свойство shouldDeleteInaccessibleFaults

на контексте управляемого объекта. Поскольку в этой статье говорится, что она уже должна изменить поведение сбоя удаленного объекта.

https://cocoacasts.com/what-are-core-data-query-generations /

Редактирование: Начиная с iOS 9 (когда это было добавлено) это значение свойства по умолчанию - ДА.

0
ответ дан 3 November 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: