2009-12-19 10 views

Odpowiedz

17

Możesz dodać drugą, prywatną deklarację readwrite do rozszerzenia klasy. Schemat zarządzania pamięcią dla wszystkich odniesień musi pasować do IIRC, więc dostajesz głupotę jak "tylko do odczytu, zachowaj".

+3

To nie jest całkowicie głupie; macierz modyfikatorów vs. @synthesize jest taka, że ​​kod gettera ** może ** się zmienić. Próbując wyłuskać dokładnie to, które modyfikatory powinny być możliwe do dodania, a które #warn powinny zawierać szczegółowe informacje i trudne do zrozumienia. Lepiej po prostu iść z "musi być taki sam, z wyjątkiem readonly-> readwrite". – bbum

+0

Wyjaśniłem, że powinienem rozwinąć mój komentarz .... – bbum

36

lub dokładniej, (tylko do odczytu, zachowują) pozwala w ten sposób wzór:

Foo.h:

@interface StuffHolder:NSObject 
@property(readonly, retain) MyStuff *stuff; 
@end 

Foo.m:

@interface StuffHolder() 
@property(readwrite, retain) MyStuff *stuff; 
@end 

@implementation StuffHolder 
@synthesize stuff; 
@end 

Wynik końcowy jest właściwość, która jest publicznie odczytywana tylko podczas odczytu wewnątrz implementacji i dla której ustawianie i pobieranie jest automatycznie syntetyzowane przez kompilator.

Ostrzeżenie mógłby być generowane w przypadku braku (ReadWrite, zachowują) nadpisanie w rozszerzeniu klasy - coś podobnego do statement without an effect - ale byłoby bardziej kłopotliwe niż korzystne. Istnieje również cała masa różnych przypadków skrajnych w kombinacjach, które również uzasadniają ostrzeżenie, ale tak naprawdę nie wskazują na rzeczywisty problem. Podjęto decyzję, aby w dużej mierze zaakceptować różne wzorce bez skargi ze względu na prostotę (ponieważ nie są to problemy z poprawnością).

+0

Jest reklamowany jako tylko do odczytu, ale nadal będzie można go zapisać, jeśli kompilator wygenerował dla niego ustawnik, prawda? – dreamlax

+1

Jeśli ktoś miałby napisać kod, aby zadzwonić do ustawiacza, oczywiście, ale bez deklarowania gdzieś metody, zobaczy ostrzeżenie ... – bbum

+0

"Publiczne" właściwości tylko do odczytu (zadeklarowane w nagłówku) i "prywatne" zachowują właściwości (zadeklarowane w pliku źródłowym) nie są już obsługiwane (z Xcode 3.2.3 - iPhone SDK 4 i GCC 3.2) błąd: zsyntetyzowane właściwości "x" i "y" oba twierdzą ivar 'z' – Felix

Powiązane problemy