Я предполагаю, что версия компилятора, которую вы используете, следует правилам управления памятью и для объявленных свойств, а точнее для методов доступа к объявленным свойствам:
Вы вступаете во владение объектом, если создаете его, используя метод, имя которого начинается с «alloc», «new», «copy» или «mutableCopy».
Свойство с именем newTitle
при синтезе дает метод с именем -newTitle
, следовательно, предупреждение / ошибка. -newTitle
должен быть методом получения для свойства newTitle
, однако в соглашениях об именах говорится, что метод, имя которого начинается с new
, возвращает объект, принадлежащий вызывающей стороне, что не относится к методам получения.
Вы можете решить эту проблему:
Переименование этого имущества:
@property (strong, nonatomic) NSString *theNewTitle;
Сохранение имени свойства и указание имени получателя, которое не начинается с одного из префиксов имени специального метода:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Сохраняя имя свойства и имя получателя, и сообщая компилятору, что, хотя имя получателя начинается с new
, оно принадлежит семейству методов none
, а не new
. семья:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
Обратите внимание, что, хотя это решение позволяет вам сохранить newTitle
как имя свойства и имя получателя, метод -newTitle
, который не возвращает объект, принадлежащий вызывающей стороне, может сбивать с толку других людей. чтение вашего кода.
Для справки, Apple опубликовала Переход к примечаниям к выпуску ARC , в которых говорится:
Нельзя присвоить свойству имя, которое начинается с new
или copy
.
Они уже были уведомлены о том, что их утверждение не совсем точное: виновником является имя метода получателя, а не имя свойства.
Редактировать 17 января 2015: Я только что заметил недавний коммит в Clang , который предлагает вариант 3 выше (с использованием objc_method_family(none)
), включая исправление, для Общий случай, когда имя свойства соответствует одному из префиксов семейства специальных методов. Xcode, вероятно, в конце концов включит это изменение.