【问题标题】:Using objc_getClassList under arcarc下使用objc_getClassList
【发布时间】:2012-02-02 13:56:03
【问题描述】:

有没有人设法在 arc 下使用 objc_getClassList,但没有关闭相关文件的 arc?

根本问题是其中一个参数是类指针的 C 数组。

【问题讨论】:

  • 好问题。在这种情况下,ARC 似乎相当尴尬。我为有问题的文件禁用了它,而不是花时间弄清楚如何围绕它跳舞,但像你一样,我很想知道在启用 ARC 的情况下是否有一种相对简单的方法。

标签: iphone ios automatic-ref-counting objective-c-runtime


【解决方案1】:

这段代码应该在 ARC 下工作:

int numClasses;
Class *classes = NULL;

classes = NULL;
numClasses = objc_getClassList(NULL, 0);
NSLog(@"Number of classes: %d", numClasses);

if (numClasses > 0 )
{
    classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
    numClasses = objc_getClassList(classes, numClasses);
    for (int i = 0; i < numClasses; i++) {
        NSLog(@"Class name: %s", class_getName(classes[i]));
    }
    free(classes);
}

【讨论】:

  • 请注意,如果您想在运行此代码的上下文之外使用 Class 对象之一(例如,作为使用 this 的函数的返回),您可以获得 ARC通过执行 NSClassFromString(NSStringFromClass(classes[i])) 来自 __unsafe_unretained 类的内存管理类。我不确定是否有更有效的方式来获取 Class 副本,但这种方式似乎对我有用。如果你只是直接返回 classes[i],你最终会得到一个悬空指针,因为对象在 free(classes) 调用中被释放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多