ios - 带有 __unsafe_unretained 类型转换的 malloc 对象生命周期

标签 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 下执行此操作。上面的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/

相关文章:

ios - NSUserDefaults。检索不正确的值

ios - 在 UITabViewController 中隐藏 "Back"按钮

ios - 如何为 iOS 创建 MDM 注册配置文件

c++ - 更正 __bridge 与 ARC 和 C++ 互操作的用法? (如何避免内存泄漏?)

ios - 是否需要在 UIViewController 中声明 UIButton 属性作为 UIKit 中的一个错误?

ios5 - dyld`dyld_fatal_error(iOS上不兼容的api)的原因是什么?

ios - Swift 数组类型

ios - 选择器中具有不同参数类型的 respondsToSelector

iphone - "The application does not have a valid signature"Xcode 4.3

iphone - 如何仅在设置标志时将代码包含到构建中?