gpt4 book ai didi

objective-c - 如何在具有 C 结构的项目中将非 ARC 项目转换为 ARC 项目?

转载 作者:太空狗 更新时间:2023-10-30 04:02:07 24 4
gpt4 key购买 nike

我有一个 Xcode 4.5.1 。我想将此项目转换为 ARC 以提高性能。我正在执行这些步骤。

编辑->重构->转换为 Objective C ARC 但出现错误:

ARC 禁止在结构或联合中使用 Objective-C 对象

  1. 我知道,我可以通过添加来阻止这些类转换为 ARC-fno-objc-arc 到编译器选项。但我也想将这些类转换为 ARC。可能吗?
  2. 如何允许 xcode 只检查某些类以进行 ARC 转换?例如,当我转换为 arc 时,它会检查类代码,但我有一些类不能转换为 arc。所以希望 Xcode 不应该在转换过程中为它们生成错误。是否可以?

最佳答案

这里基本上有两种选择:

  1. -fno-objc-arc 标志添加到您不想转换为 ARC 的文件中,但当然您不能转换它们,否则它不会编译,最好情况下,在最坏的情况下会严重泄漏。

  2. 转换所有类并解决 C 结构中 Objective-C 对象的问题。

关于第二种解决方案,您还有几个选择:

  1. 用成熟的对象替换 C 结构,让 ARC 为您处理内存

  2. 继续使用 C 结构并将其中的对象部分标记为 __unsafe_unretained,这基本上会告诉 ARC 在内存管理中忽略这些对象。因此你会得到类似的东西:

    typedef struct {
    NSInteger anInteger;
    __unsafe_unretained NSString * aString;
    } AStruct;

    这将在 ARC 下编译,这是将 Objective-C 对象保存在 C 结构中的唯一选择。请记住,ARC 不会管理这些对象的内存,因此您需要手动处理

最重要的是,我的建议是将您的 C 结构转换为类。例如,您可以轻松地将上述结构转换为:

@interface AStructReplacement : NSObject
@property (nonatomic, assign) NSInteger anInteger;
@property (nonatomic, strong) NSString * aString;
@end

这比 C 结构更安全、更一致且更易于使用。

关于objective-c - 如何在具有 C 结构的项目中将非 ARC 项目转换为 ARC 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15740076/

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