2012-05-07 3 views

ответ

18

Да, вы должны позвонить по телефону free самостоятельно. Тем не менее, указатель может участвовать в системе подсчета контрольной косвенно, если вы поместите его в экземпляре эталонного подсчета объекта:

@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 

Там нет никакого способа вокруг письма, которые называют в free - один из способов или другой, вы должны иметь его в своем коде.

+1

Итак, ARC вызовет dealloc, когда он удалит экземпляр? –

+2

@stas Ну, не прямо: ARC будет называть '[obj release]' - это его единственная работа. Только при выпуске результатов в ref counting до нуля, вызывается '[obj dealloc]'. – dasblinkenlight

5

Да. ARC применяется только к объектам Objective-C и не применяется к malloc() и free().

+0

Что относительно нового int [100] ;? –

+0

№ ARC обрабатывает экземпляры Objective-C, созданные с помощью '[ClassName alloc]'. –

+0

Извините, но не могли бы вы рассказать мне, если структура, созданная 'Vertex v;' будет считаться экземпляром Objective-C? –

0

В dealloc добавить, если нет, ноль и назначить nil для безопасного использования. Не хотите освобождать ноль, malloc может использоваться вне init и т. Д.

@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

Я не понимаю, почему вы проверяете, есть ли 'buf! = NULL' в' dealloc'. Разве вы не должны проверять, есть ли 'buf == NULL' после' malloc' в 'init', и если да, обрабатывайте эту ошибку? Тогда нет необходимости проверять, есть ли 'buf! = NULL' в' dealloc', правильно? Кроме того, в чем смысл установки 'buf = NULL' в конце' dealloc'? Особенно, если 'buf' является частной переменной экземпляра, разве вам не нужно делать что-то довольно странное в вашем коде, чтобы получить доступ к' buf' после вызова 'dealloc'? – ma11hew28

+0

Вы правы. Единственная причина для этого - избегать вызова free (null), чтобы избежать сбоя. Просто проверенный, бесплатный (null) не сбой. –

Смежные вопросы