Если я использую malloc вместе с Automatic Reference Counting, мне все еще нужно вручную освобождать память?malloc + Автоматический подсчет ссылок?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Если я использую malloc вместе с Automatic Reference Counting, мне все еще нужно вручную освобождать память?malloc + Автоматический подсчет ссылок?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Да, вы должны позвонить по телефону 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
- один из способов или другой, вы должны иметь его в своем коде.
Да. ARC применяется только к объектам Objective-C и не применяется к malloc()
и free()
.
Что относительно нового int [100] ;? –
№ ARC обрабатывает экземпляры Objective-C, созданные с помощью '[ClassName alloc]'. –
Извините, но не могли бы вы рассказать мне, если структура, созданная 'Vertex v;' будет считаться экземпляром Objective-C? –
В 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
Я не понимаю, почему вы проверяете, есть ли 'buf! = NULL' в' dealloc'. Разве вы не должны проверять, есть ли 'buf == NULL' после' malloc' в 'init', и если да, обрабатывайте эту ошибку? Тогда нет необходимости проверять, есть ли 'buf! = NULL' в' dealloc', правильно? Кроме того, в чем смысл установки 'buf = NULL' в конце' dealloc'? Особенно, если 'buf' является частной переменной экземпляра, разве вам не нужно делать что-то довольно странное в вашем коде, чтобы получить доступ к' buf' после вызова 'dealloc'? – ma11hew28
Вы правы. Единственная причина для этого - избегать вызова free (null), чтобы избежать сбоя. Просто проверенный, бесплатный (null) не сбой. –
Итак, ARC вызовет dealloc, когда он удалит экземпляр? –
@stas Ну, не прямо: ARC будет называть '[obj release]' - это его единственная работа. Только при выпуске результатов в ref counting до нуля, вызывается '[obj dealloc]'. – dasblinkenlight