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 newTitle
po zsyntezowaniu daje metodę o nazwie -newTitle
, stąd ostrzeżenie / błąd. -newTitle
ma być metodą gettera dla newTitle
właściwości, jednak konwencje nazewnictwa stanowią, że metoda, której nazwa zaczyna się od, new
zwraca 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 none
rodziny metod, a nie do new
rodziny 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ć newTitle
zaró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 new
lub 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ę.