Numer 1 różni się od pozostałych dwóch deklaracją do przodu klasy MyOtherObject, aby zminimalizować ilość kodu widzianego przez kompilator i konsolidator, a także potencjalnie uniknąć cyklicznych odwołań. Jeśli robisz to w ten sposób, pamiętaj o umieszczeniu #import w pliku .m.
Deklarując @właściwość (i dopasowując @synthesize w pliku .m), automatycznie generujesz metody akcesorów z semantyką pamięci obsługiwaną w określony sposób. Podstawową zasadą dla większości obiektów jest Zachowaj, ale NSStrings, na przykład, powinno używać Kopiuj. Natomiast Singletons i Delegates zwykle powinni używać Assign. Akcesory do ręcznego pisania są żmudne i podatne na błędy, więc oszczędza to wiele błędów związanych z pisaniem i głupimi błędami.
Ponadto zadeklarowanie zsyntetyzowanej właściwości umożliwia wywołanie metody akcesora przy użyciu notacji kropkowej w następujący sposób:
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
Zamiast normalnego sposobu przekazywania wiadomości:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
Za kulisami naprawdę wywołujesz metodę, która wygląda następująco:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
…albo to
- (MyOtherObject *) otherObject {
return otherObject;
}
Całkowity ból w tyłku, prawda. Teraz zrób to dla każdego ivara w klasie. Jeśli nie zrobisz tego dokładnie dobrze, pojawi się wyciek pamięci. Najlepiej po prostu pozwolić kompilatorowi wykonać pracę.
Widzę, że numer 1 nie ma ivar. Zakładając, że to nie jest literówka, jest w porządku, ponieważ dyrektywy @property / @synthesize zadeklarują również ivar za kulisami. Uważam, że to nowość w systemie Mac OS X - Snow Leopard i iOS4.
Numer 3 nie ma wygenerowanych akcesorów, więc musisz je napisać samodzielnie. Jeśli chcesz, aby metody akcesorów miały efekty uboczne, wykonaj standardowy taniec zarządzania pamięcią, jak pokazano powyżej, a następnie wykonaj dowolną pracę poboczną w ramach metody akcesora. Jeśli syntetyzować nieruchomości , jak również pisać własne , a następnie swoją wersja posiada priorytet.
Czy omówiłem wszystko?