2009-10-01 21 views
7

Jeśli utworzę nowy obiekt, który zawiera dwa wskaźniki obiektów (patrz poniżej) podczas tworzenia obiektu, wskaźniki zostaną ustawione tak, aby wskazywały zero;Ok, aby zwolnić wskaźnik, który jest zerowy?

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

Jeśli (z jakiegoś nieoczekiwanego powodu) nie przypisać te wskaźniki i później zwolnić je w moim sposobie dealloc jest ok, jestem pewien, że jest po prostu chciał sprawdzić?

- (void)dealloc{ 
    [name release]; 
    name = nil; 
    [thrust release]; 
    thrust = nil; 
    [super dealloc]; 
} 

gary

+2

Pamiętaj, aby wywołać "[super dealok]" na końcu twojej implementacji 'dealloc'. – Jason

+0

Przepraszam Jason, ja to wiedziałem, ale jakoś zagubił się w cut & paste. – fuzzygoat

Odpowiedz

22

Wysyłanie wiadomości do zera nie spowoduje błąd, tak to jest w porządku. Musisz się upewnić, że wskaźniki są rzeczywiście zerowe - wysłanie wiadomości do wskaźnika śmieci prawdopodobnie spowoduje błędy.

7

Tak, możesz to zrobić, ponieważ możesz bezpiecznie wysłać wiadomość (taką jak release) do nil, a ona po prostu nie zrobi nic.

1

Jeśli użyć właściwości dostępowej do tworzenia get/zestaw metod:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

aw pliku .m:

@synthesize name; 
@synthesize thrust; 

Następnie można po prostu ustawić zmienną na zero w dealloc . To w rzeczywistości wywoła twoje nastawienie i zmniejszy licznik referencji o jeden i oczyści wszystko.

+0

Vincent, jest to bardzo dobry punkt, dopiero teraz czytam o @property & @synthesize. Chciałem tylko, aby starsza szkoła była w mojej głowie, zanim przejdę do Celu-C 2.0 – fuzzygoat

+1

Jako wyjaśnienie, musiałbyś napisać self.name = nil w dealloc. Po prostu ustawienie name = nil byłoby wyciekiem z wyjątkiem GC. – sbooth

+3

Chociaż będzie działać w najprostszym przypadku, sugestia Vincenta nie jest najlepszą praktyką. Użycie 'self.name = nil' w metodzie dealloc wywoła metodę settera. Jeśli podklasa (lub ty) nadpisuje tę metodę ustawiającą w taki sposób, że ma efekty uboczne lub zależy od stanu instancji, może przerwać wywołanie z dealloc, gdy nie jest określony stan instancji. Lepiej zadzwonić [wydanie nazwy]. –

0

W Objective-C ważne jest rozróżnianie obiektów i zmiennych. Nie można zwolnić wskaźnika (wartość zmiennej), można zwolnić tylko obiekt (obiekt, do którego odnosi się wskaźnik). Wskaźnik zerowy odnosi się do żadnego obiektu, więc wiadomości wysłane do zera nie powodują żadnych działań (co jest ogólnie bezpieczne).

Powiązane problemy