我是 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 下执行此操作。上面的typecast部分是看例子构思出来的,但还是让我紧张。
我担心的一个问题是,如果我为“常规”对象分配空间,那么 dealloc
当变量超出范围时会被调用,这会在 free
之后发生叫做。但我不认为这正是这里发生的事情。
- 是否
Class
行为与其他类型的 Objective-C 数据类型不同?我是否应该从中期待其他东西? - 什么样的指针是
classes
?我猜它引用了一个未知大小的数组(一个非对象指针),但 ARC 仍然关心它,因为如果没有该转换代码将无法编译。它看起来像一个强指针,但我不知道它会指向什么。 - 是否存在指向数组中对象的强指针,或者对象本身就是强指针?如果不是,ARC 是否仍然有效,或者我应该恢复为某些 MRC 约定?
- 是否会自动调用
dealloc
?编译器何时以及如何确保发生这种情况? - 设置
classes
是否更好?至NULL
, 然后才调用free
?或者我应该遍历数组并对每个对象做一些事情,比如将它们设置为nil
?
最佳答案
您正在分配一个结构指针数组(Class == pointer to a struct),其中将填充指向注册到运行时的类的指针。只要您的应用程序运行,该指针就不会被释放/取消分配等。
您没有分配任何类,而是分配空间来保存指向此类的指针。您的代码完全没问题,__unsafe_unretained
正是您想要的。它告诉 ARC 你持有一个指向你不拥有的对象的指针,因此防止它试图在你的变量范围结束时释放它。
关于ios - 带有 __unsafe_unretained 类型转换的 malloc 对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20046287/