Obecnie używam pakietu iOS 5 SDK, próbując opracować moją aplikację. Próbuję uczynić NSString właściwością, a następnie zsyntetyzować go w pliku .m (robiłem to wcześniej bez żadnych problemów). Natknąłem się na to: „Problem semantyczny: Zsyntetyzowany getter właściwości jest zgodny z konwencją nazewnictwa kakao dotyczącą zwracania„ posiadanych ”obiektów.”
To jest mój kod: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Czy ktoś ma jakiś pomysł, jak to naprawić? Dzięki!!
Odpowiedzi:
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:
Właściwość o nazwie
newTitle
po zsyntezowaniu daje metodę o nazwie-newTitle
, stąd ostrzeżenie / błąd.-newTitle
ma być metodą gettera dlanewTitle
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:
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:
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 donone
rodziny metod, a nie donew
rodziny metod: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:
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ę.źródło
NS_RETURNS_NOT_RETAINED
jest również tym, czego potrzebujesz.Niedopuszczalne nazwy obiektów
Dopuszczalne nazwy obiektów
#arc # auto-syntezowany # xcode-4.6.1
** EDYTOWAĆ **
Najwyraźniej nie można również użyć mutableCopy .
źródło
Nazwa członka rozpoczynającego się od nowego powoduje ostrzeżenie. Zmień nazwę na editedTitle, a ostrzeżenie zniknie. Nie mogłem znaleźć dokumentacji potwierdzającej to, ale dzięki testom udało mi się ustalić, że zmienne składowe zaczynające się od „nowego” obciążają kompilator.
źródło
ARC nie pozwala na użycie „Nowy ....” w nazwie właściwości. ale możesz użyć „newTitle”, zmieniając nazwę gettera.
źródło
Nie wygląda na to, co sugerował Bavarious, co chciałeś zrobić. Wszystko, co chcesz zrobić, to zadeklarować zmienną instancji,
NewTitle
a następnie zsyntetyzować właściwość. Kiedyś musieliśmy deklarować zmienną instancji i właściwość. Już nie.Teraz uważam, że właściwy sposób to zrobić:
.h
.m
Zmienna instancji dla właściwości
newTitle
jest syntezowana. Nie chcesz, aby zmienna instancji była taka sama jak twoja właściwość - zbyt łatwa do popełniania błędów .Zobacz przykład: Deklarowanie właściwości i syntezowanie akcesoriów
źródło
NS_RETURNS_NOT_RETAINED
jest to, czego potrzebujesz.W CoreData, jeśli użyjesz „nowego ...” w atrybucie (skompiluj normalnie), nastąpi awaria losowa z wyjątkiem wyjątku „zły dostęp”.
Nie ma dziennika awarii, a linia pokazana z punktem przerwania „Wszystkie wyjątki” w niczym ci nie pomoże.
źródło
Ręczne pisanie settera o nazwie takiej samej jak właściwość usunęło to ostrzeżenie.
źródło
Oprócz kwestii, że powinieneś / nie możesz używać „nowego” przed nazwami nieruchomości, powiedzmy jeszcze jedno: staraj się unikać „nowych” przed nazwami w ogóle. „Nowy” zależy od czasu. Obecnie jest to dla Ciebie nowe, ale jakiś czas później możesz chcieć zaimplementować coś nowego. Dlatego używanie nazwy „nowy” w nazwach jest zawsze złe. Spróbuj myśleć w ten sposób: w świecie programowania „nowy” zawsze tworzy coś: nową instancję czegoś.
W przypadku, gdy chcesz przypisać inny tytuł, bieżąca nazwa to twoja właściwość titleReplacement.
Jeszcze jedno: spróbuj nazwać funkcje i metody w czasowniku, na przykład setSomething lub getSomething. Ale we właściwościach spróbuj najpierw nazwać obiekt, np. WysokośćMinimum, wysokośćMaksymalna itp. -> kiedy używasz inspektora podczas pisania kodu, zawsze szukasz obiektów. Wypróbuj to. ;-)
źródło
NS_RETURNS_NOT_RETAINED
służy do rozwiązania problemu nazewnictwa.Możemy znaleźć jego definicję w następujący sposób,
Dołącz więcej szczegółów tutaj.
źródło
Spróbuj tego:-
źródło