Dziękuję za wszystkie odpowiedzi.Mam kilka sprzecznych roszczeń więc przetestowane następujące składniki w UITableViewController
:
- (id)initWithStyle:(UITableViewStyle)style {
if ((self = [super initWithStyle:style])) {
NSLog(@"count: %d", [overlay retainCount]);
self.overlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
NSLog(@"count: %d", [overlay retainCount]);
[overlay release]; NSLog(@"released once");
NSLog(@"count: %d", [overlay retainCount]);
[overlay release]; NSLog(@"released twice");
NSLog(@"count: %d", [overlay retainCount]);
}
return self;
}
mam następujący wyjście konsoli:
Czasami prowadził dobrze:
count: 0
count: 2
released once
count: 1
released twice
count: 1
Inne razy rozbił się:
count: 0
count: 2
released once
count: 1
released twice
Program received signal: “EXC_BAD_ACCESS”.
Wiem, że metoda z użyciem tempOverlay
jest poprawna. To po prostu wydaje się być uciążliwe, ale wolę to od autorelease
, ponieważ nie rozumiem, jak działa autorelease
lub kiedy jest wywoływane. Jedno jest pewne. Powyższy kod jest nieprawidłowy, ponieważ nie chcę, aby overlay
miał zachowaną liczbę 2.
Dziwne jest to, że nie mogę tego zwolnić dwa razy. Nawet jeśli się nie zawiesza, liczba zatrzymań nie maleje.
W każdym razie, zgaduję, że będę teraz używał tempOverlay
.
Jeśli syntetyzowany zachowany ustawiający wygląda tak, jak go masz, to co dzieje się po pierwszym ustawieniu wartości? Jeśli spróbujesz najpierw zwolnić starą wartość, czy nie nastąpi awaria z NIEPOPRAWNYM DOSTĘPEM? Czy wszystkie właściwości automatycznie otrzymują początkową liczbę zatrzymań wynoszącą 1? – ma11hew28
Czy metoda 2) kiedykolwiek zostanie wykorzystana, być może po raz pierwszy zostanie ustawiona? Ale jeśli ustawisz to po ustawieniu, to stara wartość nie zostanie zwolniona (chyba że zostanie to wyraźnie określone). To może spowodować wyciek pamięci, prawda? – ma11hew28
Początkowo wartość jest zerowa, a wysłanie dowolnej wiadomości do zera (łącznie z zachowaniem/zwolnieniem) jest zerową liczbą zero. – jv42