2012-04-26 19 views
6

Chociaż jestem pewien, że one istnieją, mam trudności ze znalezieniem lub umocowaniem oficjalnej najlepszej praktyki do deklarowania punktów sprzedaży w ViewController.Czy IBOutlety powinny być ivars lub właściwości?

Istnieją 3 opcje, o ile widzę:

  1. Ivar tylko
  2. nieruchomość tylko
  3. nieruchomość wspierane z ivar

Xcode obecnie ulega awarii, gdy próbuję i auto Generuj właściwość przeciągając do mojego ViewController z IB, ale z tego, co pamiętam, czyni to tworzy właściwość bez ivar. Możliwe jest również przeciągnięcie do sekcji ivar, co spowoduje utworzenie ivar bez właściwości. Sugeruje to, że obie lokale tylko i tylko ivar są w porządku z jabłkami.

Tak więc w viewDidUnload musimy przypisać zero do któregokolwiek z naszych punktów sprzedaży, ale co z dealloc. Jeśli użyliśmy własności bez ivar, to jak możemy wydać nasz outlet, że nie powinniśmy używać żadnych akcesorów w init lub dealloc?

Wydaje mi się, że jedynym wzorem, który pozwoliłby nam wypuścić nasz outlet bez akcesora, jest użycie właściwości wspieranej przez ivar, więc możemy ręcznie zwolnić nasz ivar w dealloc bez korzystania z jego akcesora, jednak jest to jedna opcja, której nie obsługuje generowanie kodu Apple.

Odpowiedz

1

Zgodnie z ogólną zasadą zwykle tworzę akcesoria dla IBOutlet s.

W ARC lub projektów non-ARC zwykle wykonaj następujące czynności:

//.h (ARC) 
@property (nonatomic, weak) IBOutlet UILabel* myLabel; 

//.h (non-ARC) 
@property (nonatomic, retain) IBOutlet UILabel* myLabel; 

//.m 
@synthesize myLabel; 

W ten sposób można pozwolić kompilator, aby utworzyć zmienną instancji dla Ciebie. Ale możesz także zadeklarować zmienną instancji i powiedzieć kompilatorowi, aby to wykorzystał.

Następnie możesz użyć tej zmiennej accessors/instance, gdziekolwiek chcesz.

Apple Memory Management guide mówi, że trzeba unikać metod dostępowych w init lub dealloc metod, gdy masz projekty non-ARC. Na przykład:

// (non-ARC) 
- (void)dealloc 
{ 
    [myLabel release]; myLabel = nil; // I'm using the instance variable here! 
    [super dealloc];  
} 

Jest to bardzo ważne w projektach innych niż ARC. Powód jest taki, że jeśli nie ma dostępu, KVC przydzieli obiekt stalówki do zmiennej instancji i umieści na niej zatrzymanie. Jeśli zapomnisz go zwolnić, możesz mieć wyciek pamięci. Używanie akcesora zmusza cię do zwolnienia tego obiektu na końcu.

Sugeruję, aby przeczytać friday-qa-2012-04-13-nib-memory-management Mike'a Ash. To bardzo fajny artykuł na temat zarządzania końcówkami i pamięcią.

Mam nadzieję, że to pomaga.

+0

Dzięki. To jasne i fajne łącze. – Undistraction

+0

@ 1ndivisible Nie ma za co. Awansuj lub oznacz jako odpowiedź, jeśli chcesz. Twoje zdrowie. –

+0

Wezwanie do super dealera powinno nastąpić po wydaniu zmiennej instancji. –

1

Oto moje rozumienie

właściwości użytkowe dla zmiennych, które będą dostępne dla innych klas, albo czytać z (pobierające) lub zapisywane (ustawiaczy). Zarówno ustawiające, jak i pobierające są syntezowane dla właściwości.

Użyj znaków iv dla zmiennych, które będą używane wewnętrznie przez samą klasę, to znaczy, że inne klasy nie ustawią lub nie otrzymają swoich wartości.

Oczywiście można używać właściwości zamiast ivars, ale ponoszą one koszty wywołania funkcji, gdy są dostępne. Więc jeśli masz wewnętrzną zmienną, do której uzyskujesz dostęp przez klasę, wywołania funkcji będą wpływać na wydajność w czasie rzeczywistym, a tego można uniknąć deklarując je jako ivars.

Powiązane problemy