gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:17 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com