【问题标题】:Fixing ARC error when using Objective-C object in struct在结构中使用 Objective-C 对象时修复 ARC 错误
【发布时间】:2013-01-24 22:49:30
【问题描述】:

我的 Xcode 项目有问题。

我有以下几行:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}

我收到此错误:

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

我该如何解决?

我似乎不知道这如何违反 ARC,但我很想学习。

【问题讨论】:

标签: xcode


【解决方案1】:

当我们在启用 ARC 的 Objective C 中定义 C 结构时,我们收到错误“ARC forbids Objective-C objects in struct”。在这种情况下,我们需要使用关键字__unsafe_unretained

例子

struct Books{

    NSString *title;
    NSString *author;
    NSString *subject;
    int book_id;
};

在启用 ARC 的项目中使用的正确方法:

struct Books{

    __unsafe_unretained NSString *title;
   __unsafe_unretained NSString *author;
   __unsafe_unretained NSString *subject;
   int book_id;
};

【讨论】:

    【解决方案2】:

    最安全的方法是使用__unsafe_unretained或直接使用CFTypeRef,然后使用__bridge__bridge_retained__bridge_transfer

    例如

    typedef struct Foo {
        CFTypeRef p;
    } Foo;
    
    int my_allocating_func(Foo *f)
    {
        f->p = (__bridge_retained CFTypeRef)[[MyObjC alloc] init];
        ...
    }
    
    int my_destructor_func(Foo *f)
    {
        MyObjC *o = (__bridge_transfer MyObjC *)f->p;
        ...
        o = nil; // Implicitly freed
        ...
    }
    

    【讨论】:

      【解决方案3】:

      改成:

      typedef struct
      {
          __unsafe_unretained NSString *escapeSequence;
          unichar uchar;
      }MyStruct;
      

      但是,我建议遵循 this documentation 的 Apple 规则。

      ARC 执行新规则

      您不能在 C 结构中使用对象指针。
      您可以创建一个 Objective-C 类来管理数据,而不是使用结构。

      【讨论】:

      • 此响应已过时。从 WWDC '18 开始,您现在可以在 C 结构中指定 ARC 对象指针。
      • clang (2019) 的结构中似乎至少支持 __strong 和 __weak。
      【解决方案4】:

      我刚刚将相同的代码从 Google Toolbox for Mac 集成到我的项目中

      GTMNSString-HTML.m

      他们建议 ARC Compatibility 在每个文件中添加 -fno-objc-arc 标志对我有用。

      【讨论】:

      • 兄弟,您是否将上述代码用于 epub 阅读器。如果是这样,请指导我将其转换为弧。这对我非常有帮助....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2011-12-26
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多