Я гадаю, що версія компілятора, яку ви використовуєте, також дотримується правил управління пам'яттю для оголошених властивостей - точніше, для доступних оголошених ресурсів:
Ви приймаєте право власності на об'єкт, якщо ви створюєте його за допомогою методу, ім'я якого починається з "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, ймовірно, включить цю зміну з часом.