2012-05-07 17 views

Respuesta

18

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.

+1

Entonces ARC llamará a dealloc cuando elimine la instancia? –

+2

@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

5

Sí. ARC solo se aplica a las instancias de Objective-C, y no se aplica a malloc() y free().

+0

¿qué hay de nuevo int [100] ;? –

+0

No. ARC solo maneja instancias de Objective-C creadas con '[ClassName alloc]'. –

+0

Lo siento, pero podría decirme si una estructura hecha por 'Vertex v;' ¿Contaría como una instancia de Objective-C? –

0

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 
+0

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

+0

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. –