Jeśli używam malloc wraz z funkcją automatycznego liczenia referencji, czy nadal muszę ręcznie zwolnić pamięć?malloc + automatyczne liczenie odniesień?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Jeśli używam malloc wraz z funkcją automatycznego liczenia referencji, czy nadal muszę ręcznie zwolnić pamięć?malloc + automatyczne liczenie odniesień?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
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.
Tak. ARC dotyczy tylko instancji klasy Objective-C i nie ma zastosowania do malloc()
i free()
.
co z nowym int [100] ;? –
Nie. ARC obsługuje tylko instancje klasy Object-C utworzone za pomocą '[ClassName alloc]'. –
Przepraszam, ale czy możesz mi powiedzieć, czy struktura utworzona przez "Vertex v;" byłby liczony jako instancja klasy Objective-C? –
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
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
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. –
ARC wywoła dealloc po usunięciu instancji? –
@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