【问题标题】:malloc + Automatic Reference Counting?malloc + 自动引用计数?
【发布时间】:2012-05-07 02:37:49
【问题描述】:

如果我将 malloc 与自动引用计数一起使用,是否仍需要手动释放内存?

int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);

【问题讨论】:

    标签: objective-c malloc automatic-ref-counting


    【解决方案1】:

    是的,您必须自己编写对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在删除实例时会调用dealloc吗?
    • @stas 好吧,不是直接的:ARC 会调用[obj release] - 这是它唯一的工作。只有当释放导致引用计数下降到零时,才会调用[obj dealloc]
    【解决方案2】:

    是的。 ARC 仅适用于 Objective-C 实例,不适用于 malloc()free()

    【讨论】:

    • 没有。 ARC 仅处理使用 [ClassName alloc] 创建的 Objective-C 实例。
    • 对不起,你能告诉我一个结构是否由 'Vertex v;'会算作一个 Objective-C 实例吗?
    • 不,Vertex v; 不进行任何堆内存分配。作为一个局部变量,它将被分配到堆栈上,并在作用域退出时自动丢弃。作为另一个结构或对象的一部分,它将受包含对象的释放规则的约束。
    • stas: int[100] 无论如何都不是free() 的有效参数,因为它将在堆栈上分配。
    【解决方案3】:

    NSData 的一些“NoCopy”变体可以与对 malloc 的调用配对,这将使您不必释放任何东西。

    NSMutableData 可以用作 calloc 的更高开销版本,它提供了 ARC 的便利性和安全性。

    【讨论】:

      【解决方案4】:

      在 dealloc 中添加一个 if not nil 并分配给 nil 以确保安全。不想释放 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
      

      【讨论】:

      • 我不明白你为什么在dealloc 中检查buf != NULL。你不应该在init 中的malloc 之后检查buf == NULL,如果是,则处理该错误?那么,不需要检查buf != NULL 是否在dealloc 中,对吧?另外,在dealloc 末尾设置buf = NULL 有什么意义?特别是,如果buf 是一个私有实例变量,那么在调用dealloc 之后,您是否必须在代码中做一些非常奇怪的事情才能访问buf
      • 你是对的。 if 的唯一原因是避免调用 free(null) 以避免崩溃。刚刚测试,free(null) 不会崩溃。
      猜你喜欢
      • 2018-03-04
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多