Si utilizo malloc junto con el recuento automático de referencias, ¿aún tengo que liberar la memoria manualmente?malloc + Conteo de referencia automático?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Si utilizo malloc junto con el recuento automático de referencias, ¿aún tengo que liberar la memoria manualmente?malloc + Conteo de referencia automático?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Sí, debe codificar la llamada al free
usted mismo. Sin embargo, el puntero puede participar en el sistema de recuento de referencias indirectamente si lo pones en una instancia de un objeto de referencia contado:
@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
No hay forma de evitar la escritura que llamar a free
- de una manera u otro, debes tenerlo en tu código.
Sí. ARC solo se aplica a las instancias de Objective-C, y no se aplica a malloc()
y free()
.
¿qué hay de nuevo int [100] ;? –
No. ARC solo maneja instancias de Objective-C creadas con '[ClassName alloc]'. –
Lo siento, pero podría decirme si una estructura hecha por 'Vertex v;' ¿Contaría como una instancia de Objective-C? –
En dealloc agregue un if not nil y asigne a nil para seguridad. No desea liberar nil, malloc podría usarse fuera de init etc.
@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
No entiendo por qué comprueba si 'buf! = NULL' en' dealloc'. ¿No deberías comprobar si 'buf == NULL' después de' malloc' en 'init', y si es así, manejar ese error? Entonces, no hay necesidad de verificar si 'buf! = NULL' en' dealloc', ¿verdad? Además, ¿cuál es el punto de establecer 'buf = NULL' al final de' dealloc'? Especialmente, si 'buf' es una variable de instancia privada, ¿no tendría que estar haciendo algo bastante extraño en su código para acceder a' buf' después de llamar a 'dealloc'? – ma11hew28
Tienes razón. La única razón para el if es evitar llamar gratis (nulo) para evitar un bloqueo. Recién probado, libre (nulo) no falla. –
Entonces ARC llamará a dealloc cuando elimine la instancia? –
@stas Bueno, no directamente: ARC llamará '[obj release]' - ese es su único trabajo. Solo cuando se lanzan resultados en el recuento de ref bajando a cero, se llama al '[obj dealloc]'. – dasblinkenlight