/ / Konwencja nazewnictwa zmiennych instancji podczas syntezy właściwości - ios, objective-c, macos

Nazewnictwo zmiennych instancji podczas syntezowania właściwości - ios, cel-c, macos

Podczas syntezy właściwości w Objective-C zaleca się, aby nie pisać po prostu:

@synthesize window;

ale raczej

@synthesize window = _window;

Powodem jest to, że nie chcesz, aby zmienna instancji nosiła taką samą nazwę jak metoda pobierająca lub „mogą się zdarzyć złe rzeczy”.

Zawsze używałem @synthesize var1, var2, etc w moich aplikacjach bez „złych rzeczy”. Jakie złe rzeczy mogą się wydarzyć?

Odpowiedzi:

5 dla odpowiedzi № 1

Zdarzały się złe rzeczy, szczególnie wdni przed ARC, kiedy ludzie przypisywaliby obiekty do iVar magazynu zamiast do właściwości. Gdyby było to zrobione przez przypadek, zarządzanie pamięcią implikowane przez zsyntetyzowany seter nie zostałoby zastosowane, co prowadziłoby do wycieków lub przedwczesnych wydań.

Zwykłem robić to w prosty sposób, ale teraz używamprzedrostki. Nie deklaruję już własnego iVara, pozwalam współczesnemu środowisku wykonawczemu zająć się tym za mnie. Używam prefiksów, aby przypadkowo nie używać iVar jako zmiennej lokalnej.

Ponadto - odnoszę się do moich właściwości jako self.iVar prawie wszędzie na moich zajęciach. Dzieje się tak, aby móc używać właściwości wczytywanych leniwie, gdy chcę, bez martwienia się o to, które z nich są ładowane leniwie, a które nie.


0 dla odpowiedzi nr 2

Największy powód, dla którego warto skorzystać z czołówkipodkreślenie w zmiennych instancji (takich jak _myProperty) oznacza, że ​​kiedy ludzie czytają kod z początkowym podkreśleniem, wiedzą, że używasz zmiennej instancji, a nie zmiennej lokalnej, zmiennej globalnej lub zapomnieli napisać „self”. jak self.myProperty i że zrobiłeś to celowo.

Przed ARC _myProperty nie robiłoby żadnego odniesienialiczenie, podczas gdy self.myProperty by (dla "zachowywania" / "silnych" właściwości). W przypadku ARC, gdy używasz właściwości "kopiuj", _myProperty zlicza odniesienia, ale nadal nie kopiuje, więc nadal istnieje pewna różnica. Najważniejsza różnica polega na tym, że _myProperty nie wywoła żadnych obserwatorów.