2009-10-01 10 views
7

Se creo un nuovo oggetto che include due puntatori oggetto (vedi sotto) quando l'oggetto viene creato, i puntatori sono impostati in modo che puntino a zero;Ok per rilasciare un puntatore thats nil?

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

Se (per qualche motivo inaspettato) non assegnare questi puntatori e poi rilasciarli nel mio metodo dealloc è che ok, io sono abbastanza sicuro che è, volevo solo controllare?

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

Gary

+2

Ricordarsi di chiamare '[super dealloc]' alla fine dell'implementazione 'dealloc'. – Jason

+0

Scusa Jason, lo sapevo, ma in qualche modo si è perso nel taglia e incolla. – fuzzygoat

risposta

22

Invio di un messaggio a zero non causerà un errore, quindi questo è bene. È necessario accertarsi che i puntatori siano effettivamente nulli, tuttavia l'invio di un messaggio a un garbage pointer probabilmente causerà errori.

7

Sì, è possibile farlo perché è possibile inviare un messaggio sicuro (ad esempio release) a nil e non farà nulla.

1

Se si utilizza la proprietà di accesso per creare i metodi get/set:

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

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

E nel file .m:

@synthesize name; 
@synthesize thrust; 

È quindi possibile solo impostare la variabile a zero in dealloc . In effetti, questo chiamerà il tuo setter e decrementerà il conteggio di riferimento di uno e pulirà le cose.

+0

Vincent, questo è un ottimo punto, sto solo leggendo su @property e @synthesize in questo momento. Volevo solo avere la vecchia scuola in testa prima di andare più verso Objective-C 2.0 – fuzzygoat

+1

Come chiarimento, dovresti scrivere self.name = nil in dealloc. Semplicemente l'impostazione nome = nil sarebbe una perdita tranne che in GC. – sbooth

+3

Anche se funzionerà nel caso più semplice, il suggerimento di Vincent non è la migliore pratica. L'uso di 'self.name = nil' nel metodo dealloc chiamerà il metodo setter. Se una sottoclasse (o te) sovrascrive questo metodo setter in modo che abbia effetti collaterali o dipenda dallo stato dell'istanza, potrebbe interrompersi quando viene chiamato da dealloc dove lo stato dell'istanza non è determinato. È * molto * meglio chiamare [name release]. –

0

È importante in Objective-C distinguere tra oggetti e variabili. Non è possibile rilasciare un puntatore (il valore di una variabile), è possibile solo rilasciare un oggetto (l'oggetto a cui fa riferimento un puntatore). Un puntatore zero si riferisce a nessun oggetto, quindi i messaggi inviati a zero non fanno nulla (che è generalmente sicuro).

Problemi correlati