Я предполагаю, что используемая вами версия компилятора следует правилам управления памятью и для объявленных свойств - более конкретно, для объявленных методов доступа к свойствам:
Вы вступаете во владение объектом, если создаете его с помощью метода, имя которого начинается с «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, вероятно, будет включать это изменение в конце концов.