Dziś rano wpadłem w awarię w aplikacji na iPhone, nad którą pracuję i podczas naprawiania błędu, jestem ciekawy z powodu składniowej przyczyny problemu.Ustawianie właściwości klasy Objective-C bez korzystania z samodzielnego odwołania
Oto mój kod zredukowany do prostych elementów. Zapełniam elementy w TableView za pomocą NSArray dla przedmiotów. NSArray jest własnością:
@interface FooViewController : UITableViewController {
NSArray *stuff;
}
@property (nonatomic, retain) NSArray *stuff;
I w moim pliku wdrażania:
@synthesize stuff;
- (void)viewDidLoad {
NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",
@"Lorem", @"Ipsum", nil];
self.stuff = arr;
[arr release];
}
Teraz, kiedy po raz pierwszy napisał metodę, przypadkowo wypaść poza "ja". i to spowodowało bombę. Chociaż podczas testowania działało na pierwszy rumieniec. Ja próbowałem:
stuff = arr;
NSLog(@"%d", [stuff count]);
Ale używając rzeczy w innych metodach zbombardowany. Po rozwiązaniu problemu mogę używać funkcji [liczba rzeczy] w innych miejscach.
Dlaczego więc mogę używać rzeczy w niektórych miejscach, ale w innych muszę użyć self.stuff?
Jeśli zamierzasz używać właściwości, powinieneś używać ich wszędzie, tzn. Zawartość dealloc powinna po prostu przeczytać: self.stuff = nil; Powszechnym sposobem uniknięcia błędów jest zadeklarowanie zmiennej instancji jako: NSArray * _stuff; Deklaracja właściwości pozostaje taka sama, ale instrukcja syntezy powinna wyglądać teraz tak: @synthesize stuff = _stuff; Teraz za każdym razem, gdy spróbujesz użyć rzeczy bez własnego użytku, kompilator zgłosi błąd. –
Właściwie Apple zaleca dealloc, aby bezpośrednio udostępniać zmienne klasy, a nie korzystać z właściwości - dzieje się tak dlatego, że jeśli korzystasz z właściwości, możesz uruchamiać powiadomienia KVC lub prawdopodobnie uruchamiasz inne efekty uboczne z nadpisywania syntezowanych metod pobierania/ustawiania. –
Dzięki za cynk. Zastanawiam się, jakie to ma znaczenie, zwłaszcza, że może nie chcieć * uruchamiać KVO? Nie wspominając o tym, że we współczesnym środowisku wykonawczym * będziemy * używać akcesorów z syntezowanymi zmiennymi instancji. Wyobrażam sobie, że Apple upewnia się, że ich kod chroni przed takimi rzeczami. Do tej pory nie napotkaliśmy żadnych problemów z moim kodem, ale teraz będę ostrzeżony, że zostałem ostrzeżony :-) –