Я гадаю, що версія компілятора, яку ви використовуєте, також дотримується правил управління пам'яттю для оголошених властивостей - точніше, для доступних оголошених ресурсів:
Ви приймаєте право власності на об'єкт, якщо ви створюєте його за допомогою методу, ім'я якого починається з "alloc", "new", "copy" або "mutableCopy".
Властивість, названа newTitleпри синтезі, дає метод, який називається -newTitle, отже, попередження / помилка. -newTitleповинен бути методом getter для newTitleвластивості, однак умовами іменування визначено, що метод, ім'я якого починається зnew повернення об'єкта, який належить абоненту, що не стосується методів getter.
Вирішити це можна за допомогою:
Перейменування цієї властивості:
@property (strong, nonatomic) NSString *theNewTitle;
Збереження імені властивості та вказівка імені отримувача, який не починається з одного з префіксів імені спеціального методу:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Збереження імені властивості та імені getter та повідомлення компілятора про те, що, хоч ім'я getter починається з 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як ім'я властивості, так і ім'я getter, використання методу -newTitle, який не повертає об'єкт, що належить абоненту, може заплутати інших людей, які читають ваш код.
Для запису Apple опублікувала « Перехід до приміток випуску ARC» , в яких вони заявляють:
Ви не можете надати властивості ім'я, яке починається з newабо copy.
Вони вже отримали повідомлення, що їх твердження не зовсім точне: винуватцем є ім'я методу getter, а не ім'я властивості.
Редагувати 17 січня 2015 року: Я щойно помітив нещодавнє зобов’язання Clang, яке пропонує варіант 3 вище (використовуючи objc_method_family(none)), включаючи виправлення, для загального випадку, коли ім'я властивості відповідає одному з префіксів сімейства спеціальних методів. Xcode, ймовірно, включить цю зміну з часом.