Приложение аварийно завершает работу, если имя свойства начинается с нового

В моем проекте я использую coredata. Один из объектов имеет атрибут с именем newTotal, в соответствующем ему классе NSManagedObject объявление свойства похоже на

@property (nonatomic, strong) NSString *newTotal;

Если я добавлю такое свойство в подкласс NSObject, XCode покажет ошибку, например

error: property's synthesized getter follows Cocoa naming convention for returning 'owned' objects

Но в подклассах объектов NSManaged ошибка не отображается, но приложение вылетает при доступе к свойству, что-то вроде EXC_BAD_ACCESS.

Почему XCode не показывает ошибку, но приложение вылетает? Это ошибка с XCode/clang/LLVM?

Я знаю, что это что-то связанное с синтезом. Подклассы NSManagedObject не синтезируют свойство в нем, а директива @dynamic просто сообщает компилятору, что методы геттера и сеттера реализованы не самим классом, а где-то еще (например, в суперклассе или будут предоставлены во время выполнения). Но у меня нет четкого представления об этом. Может ли кто-нибудь дать четкое представление о проблеме?


person Johnykutty    schedule 23.01.2014    source источник


Ответы (1)


Я вижу, вы используете ARC.

В ARC память управляется за вас, но есть несколько вещей, которые вы можете/должны сделать самостоятельно. Вы не можете назвать свойство "newXxxx", потому что:

https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Вы не можете дать методу доступа имя, начинающееся с new. Это, в свою очередь, означает, что вы не можете, например, объявить свойство, имя которого начинается с new, если вы не укажете другой геттер:

// Не будет работать:

@property NSString *newTitle;

// Работает:

@property (getter=theNewTitle) NSString *newTitle;
person avuthless    schedule 23.01.2014
comment
Я это знаю, но почему в подклассах NSMAnageObject не отображается ошибка, а приложение вылетает - person Johnykutty; 23.01.2014
comment
NSManagedObject в основном используется для нестандартных постоянных атрибутов. Это позволяет вам использовать объекты или структуры данных, которые напрямую не поддерживаются в iOS. Я мог бы предположить, что, создав подкласс этого объекта, вы обойдете любые регулярные проверки памяти, поскольку это может помешать вам использовать желаемую структуру данных. - person avuthless; 23.01.2014
comment
Но почему вам нужно, чтобы эта ошибка была показана. Вы знаете, что вам нельзя этого делать, и просто избегайте этого, и все будет хорошо. - person iOS Dev; 23.01.2014
comment
Для получения дополнительной информации см. документы NSManagedObject: developer.apple.com/library/mac/documentation/cocoa/reference/ - person avuthless; 23.01.2014
comment
Поскольку не все знают об этой ошибке, и поскольку ARC был представлен намного позже, чем сам xCode с ручным управлением памятью, многим старым разработчикам приходилось видеть это предупреждение, чтобы знать, что реализованы некоторые новые правила именования. - person avuthless; 23.01.2014
comment
@Johnykutty: атрибут Core Data newTotal не вызывает ошибки компилятора, поскольку он равен @dynamic. Компилятор не знает семантики владения динамически созданным методом-геттером, поэтому предполагает, что все в порядке. - Конечно, компилятор Core Data Model мог бы об этом предупредить, но не предупреждает. - person Martin R; 23.01.2014