2012-05-07 16 views

Odpowiedz

18

Tak, musisz samodzielnie zakodować połączenie z free. Jednak wskaźnik może uczestniczyć w systemie liczenia odniesienia pośrednio jeśli umieścić go w instancji odniesienia liczone obiektu:

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 
-(void)dealloc { 
    free(buf); 
} 

@end 

Nie ma sposobu, wokół piśmie, że wezwanie do free - tak czy inne, musisz to mieć w swoim kodzie.

+1

ARC wywoła dealloc po usunięciu instancji? –

+2

@stas No cóż, nie bezpośrednio: ARC nazwie "[wydanie obj]" - to jedyna praca. Dopiero po zwolnieniu wyników w zliczaniu zliczeń spadnie do zera, wywoływany jest "[obj dealloc]". – dasblinkenlight

5

Tak. ARC dotyczy tylko instancji klasy Objective-C i nie ma zastosowania do malloc() i free().

+0

co z nowym int [100] ;? –

+0

Nie. ARC obsługuje tylko instancje klasy Object-C utworzone za pomocą '[ClassName alloc]'. –

+0

Przepraszam, ale czy możesz mi powiedzieć, czy struktura utworzona przez "Vertex v;" byłby liczony jako instancja klasy Objective-C? –

0

W dealloc dodaj wartość jeśli nie nil i przypisz zero do bezpiecznego. Nie chcesz zwolnić nil, malloc może być użyty poza init itd.

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 

-(void)dealloc { 
    if(buf != null) { 
     free(buf); 
     buf = null; 
    } 
} 

@end 
+0

Nie rozumiem, dlaczego sprawdzasz, czy 'buf! = NULL' w' dealloc'. Nie powinieneś zamiast tego sprawdzić, czy 'buf == NULL' po' malloc' w 'init', a jeśli tak, obsłużyć ten błąd? Wtedy nie ma potrzeby sprawdzania, czy 'buf! = NULL' w' dealloc', prawda? Ponadto, jaki jest sens ustawienie 'buf = NULL' na końcu' dealloc'? Zwłaszcza, jeśli 'buf' jest prywatną instancją, czy nie musiałbyś robić czegoś bardzo dziwnego w swoim kodzie, aby uzyskać dostęp do' buf' po wywołaniu 'dealloc'? – ma11hew28

+0

Masz rację. Jedynym powodem, dla którego należy unikać dzwonienia za darmo (null), aby uniknąć awarii. Po prostu przetestowany, darmowy (null) nie ulega awarii. –