Domyślam się, że wersja kompilatora, której używasz, jest zgodna z regułami zarządzania pamięcią dla zadeklarowanych właściwości - a ściślej - dla akcesorów zadeklarowanych właściwości:
Przejmujesz własność obiektu, jeśli tworzysz go przy użyciu metody, której nazwa zaczyna się od „przydziel”, „nowy”, „kopiuj” lub „mutableCopy”.
Właściwość o nazwie newTitlepo zsyntezowaniu daje metodę o nazwie -newTitle, stąd ostrzeżenie / błąd. -newTitlema być metodą gettera dla newTitlewłaściwości, jednak konwencje nazewnictwa stanowią, że metoda, której nazwa zaczyna się od, newzwraca obiekt będący własnością obiektu wywołującego, co nie ma miejsca w przypadku metod gettera.
Możesz rozwiązać ten problem przez:
Zmiana nazwy tej właściwości:
@property (strong, nonatomic) NSString *theNewTitle;
Zachowanie nazwy właściwości i określenie nazwy pobierającej, która nie zaczyna się od jednego ze specjalnych prefiksów nazw metod:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Zachowując zarówno nazwę właściwości, jak i nazwę modułu pobierającego, i informując kompilator, że nawet jeśli nazwa modułu pobierającego zaczyna się od new, należy do nonerodziny metod, a nie do newrodziny metod:
#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
Zauważ, że chociaż to rozwiązanie pozwala zachować newTitlezarówno nazwę właściwości, jak i nazwę modułu pobierającego, posiadanie metody -newTitle, która nie zwraca obiektu należącego do osoby wywołującej, może być mylące dla innych osób czytających Twój kod.
Dla przypomnienia Apple opublikowało Informacje o przejściu na ARC , w których stwierdza:
Nie możesz nadać właściwości nazwy zaczynającej się od newlub copy.
Zostali już powiadomieni, że ich oświadczenie nie jest całkiem dokładne: winowajcą jest nazwa metody pobierającej, a nie nazwa właściwości.
Edytuj 17 stycznia 2015: Właśnie zauważyłem ostatnie zatwierdzenie dla Clanga, które sugeruje opcję 3 powyżej (użycie objc_method_family(none)), w tym poprawkę, w ogólnym przypadku, gdy nazwa właściwości pasuje do jednego ze specjalnych prefiksów rodziny metod. Xcode prawdopodobnie ostatecznie wprowadzi tę zmianę.