Почему объявление свойства устанавливает тип логического атрибута в NSNumber, когда Xcode автоматически создает файлы классов управляемых объектов?

Когда Xcode автоматически создает файлы классов для сущностей в модели данных, любые атрибуты, которые я указал как Boolean, получают тип NSNumber в объявлении свойства:

@property (nonatomic, retain) NSNumber * isGood;

Поскольку я использую ARC, не должен ли он быть strong, а не retain?

Возможно, это происходит потому, что Boolean нельзя преобразовать в объект. Это правильно? Если да, то как я могу использовать атрибуты, которые должны иметь логические значения?


person maxedison    schedule 18.12.2011    source источник


Ответы (3)


При генерации классов для базовой модели данных есть флажок «Использовать скалярные свойства для примитивных типов». Если вы выберете это, он будет использовать тип BOOL для ваших логических свойств. Поскольку сейчас используется тип-примитив, он также не будет содержать в объявлении ключевых слов (или сильных слов).

person Tim Dean    schedule 18.12.2011
comment
Есть ли причина НЕ устанавливать этот флажок? Другими словами, есть ли какая-то причина, по которой выгодно оставить его как NSNumber? А как насчет целочисленных атрибутов? Должен ли я проверить это скалярное поле для них? - person maxedison; 18.12.2011
comment
В какой-то момент я помню, как читал, что чрезмерное использование скалярных свойств может повлиять на производительность из-за того, как базовые данные требуют реализации геттеров и сеттеров для скалярных свойств. Однако я не знаю, так ли это до сих пор, и было ли это когда-либо правдой в этом отношении. Производительность была адекватной в моих приложениях, использующих скалярные свойства, поэтому мне никогда не приходилось проводить тщательную оптимизацию производительности в этой области. - person Tim Dean; 19.12.2011
comment
Но мне пришлось бы реализовать свои собственные геттеры и сеттеры для скалярных свойств, верно? - person maxedison; 19.12.2011
comment
Мне не приходилось этого делать, по крайней мере, на данный момент. Когда вы отметите параметр «Использовать скалярные свойства» в текущей версии Xcode, он позаботится обо всем. Я не проводил полного анализа, чтобы увидеть, что там происходит, но у меня это работает (пока) без реализации пользовательских геттеров или сеттеров. - person Tim Dean; 19.12.2011
comment
Обсуждение плюсов и минусов скаляра можно найти на сайте разработчиков Apple: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ - person Sofi Software LLC; 04.02.2012

Да, NSNumber используется, поскольку BOOL не является объектом. То же самое верно для CGFloat и NSInteger и т.п.

Чтобы получить значение BOOL из NSNumber, используйте [myNSNumber boolValue];.

person dasdom    schedule 18.12.2011
comment
NSNumber является объектом. Определенно. CGFloat и NSInteger являются определениями типов. - person paulbailey; 19.12.2011

Я прочитал конверсию между Макседисоном и Тимом Дином и перепроверил. Оказывается, Тим может быть не прав. Вы должны реализовать геттер и сеттер.

Согласно http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html#//apple_ref/doc/uid/TP40001919-SW13

Вы можете объявить свойства как скалярные значения, но для скалярных значений Core Data не может динамически генерировать методы доступа — вы должны предоставить свои собственные реализации.

Плюсы и минусы (в том же документе):

Преимущества предоставления Core Data возможности управлять собственным хранилищем обычно перевешивают любые преимущества прямого взаимодействия со скалярными значениями, хотя, если вы подозреваете, что это не так для вашего приложения, вам следует использовать инструменты анализа производительности для проверки.

person tzuchien.chiu    schedule 19.09.2012