使用__unsafe_unretained类型转换的malloc对象生存期

时间:2013-11-18 11:09:27

标签: ios objective-c automatic-ref-counting objective-c-runtime unsafe-unretained

我是Objective-C和ARC的新手,在没有找到答案的情况下进行了几个小时的搜索和阅读。代码完成了我想要它做的事情,但我想知道它并不依赖于有利的条件。这是我的代码的简化版本:

+(void)foo {
    Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * someValue);

    // Perform work without complicated memory management

    free(classes);
}

我不能对我分配的结构做很多事情。它由objc_getClassList填充。不幸的是,Apple似乎没有更新他们的文档来解释如何在ARC下执行此操作。上面的类型部分是通过看一些例子来构思的,但它仍然让我感到紧张。

我担心的一个问题是,如果我愿意为#"常规"对象,然后在变量超出范围时调用dealloc,这在调用free之后就会发生。但我不认为这正是在这里发生的事情。

  • Class的行为与其他类型的Objective-C数据类型有何不同?我应该从中得到别的东西吗?
  • 什么样的指针是classes?我猜它引用了一个未知大小的数组(一个非对象指针),但ARC仍然关心它,因为代码不会在没有该转换的情况下编译。它看起来像一个强大的指针,但我不知道它将成为一个强大的指针。
  • 根本没有指向数组中对象的强指针,或者对象本身是强指针吗?如果没有,ARC仍然可以工作,还是应该恢复一些MRC约定?
  • 是否会自动拨打dealloc?何时以及编译器如何确保发生这种情况?
  • 最好将classes设置为NULL,然后才能调用free吗?或者我应该遍历数组并对每个对象执行某些操作,例如将它们设置为nil

2 个答案:

答案 0 :(得分:2)

你正在分配一个结构指针数组(Class ==指向结构的指针),它将填充指向运行时注册的类的指针。只要您的应用程序运行,就不会释放/取消分配此指针。 你没有分配任何类,你正在分配空间来保存指向这个类的指针。您的代码完全正常,__unsafe_unretained正是您想要的。它告诉ARC你持有一个指向你不拥有的对象的指针,因此阻止它试图在变量范围的末尾释放它。

答案 1 :(得分:2)

  

Class的行为与其他类型的Objective-C数据不同   类型?我应该从中得到别的东西吗?

Class是一种可以保存指向任何类对象的指针的类型,就像id是一种可以保存指向任何对象的指针的类型,以及NSString *是一种类型可以包含指向任何对象的指针的类型,该对象是NSString(或其子类型)的实例。类对象是(一种)对象,其工作方式与其他对象的工作方式基本相同。类型Class可以像其他对象指针类型一样使用。

  

什么样的指针是类?我猜它引用了一个数组   未知大小(非对象指针),但ARC仍然关心它   因为没有那个演员,代码将无法编译。它看起来很强大   指针,但我不知道它是一个强大的指针。

classes是指向Class的指针,即指向类对象的指针。您在此处使用它指向Class数组的第一个成员,这是正确的。 classes不是对象指针,但它是指向对象指针的指针;这就是ARC关心的原因。就像您将malloc的结果投射到id *NSString **一样。如果您未在Class上指定限定符,则为implicitly __unsafe_unretained。所以classes已经是指向未保留对象指针的指针。

  

是否存在指向数组中对象的强指针,或者是   对象本身强大的指针?如果没有,ARC仍然有效,   或者我应该恢复一些MRC惯例?

     

是否会自动调用dealloc?什么时候,怎么可以   编译器确保发生这种情况?

Class包含指向类对象的指针。类对象基本上是单例;它们不是参考计数。它们通常在程序的持续时间内存在,除非是卸载了类。没有必要保持对类对象的显式强引用;班上会留下来。

  

将类设置为NULL是更好的做法,然后才进行操作   打电话给免费?或者我应该迭代数组并做一些事情   关于每个对象,例如将它们设置为nil?

你显然不应该在调用free()之前将classes设置为NULL ;这样,调用free(classes);将不会做任何事情。由于这个数组的元素是__unsafe_unretained,所以在释放内存之前没有必要将它们设置为任何东西;它不会有所作为。