在struct中使用Objective-C对象时修复ARC错误

时间:2013-02-09 04:31:43

标签: xcode

我的Xcode项目存在问题。

我有以下几行:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}

我收到此错误:

  

ARC禁止结构或联合中的Objective-C对象。

我该如何解决?

我似乎无法发现这是如何违反ARC的,但我很乐意学习。

4 个答案:

答案 0 :(得分:32)

将其更改为:

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

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

  

ARC强制执行新规则

     

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

答案 1 :(得分:7)

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

e.g

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
    ...
}

答案 2 :(得分:0)

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

GTMNSString-HTML.m

他们建议ARC Compatibility为每个文件添加-fno-objc-arc标志。

答案 3 :(得分:0)

当我们使用ARC启用在Objective C中定义C结构时,我们得到错误" ARC禁止在struct"中使用Objective-C对象。在这种情况下,我们需要使用关键字__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;
};