我是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仍然关心它,因为代码不会在没有该转换的情况下编译。它看起来像一个强大的指针,但我不知道它将成为一个强大的指针。dealloc
?何时以及编译器如何确保发生这种情况?classes
设置为NULL
,然后才能调用free
吗?或者我应该遍历数组并对每个对象执行某些操作,例如将它们设置为nil
?答案 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
,所以在释放内存之前没有必要将它们设置为任何东西;它不会有所作为。