12

我的 Xcode 项目有问题。

我有这些行:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}

我收到了这个错误:

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

我该如何解决?

我似乎无法找到这如何违反 ARC,但我很想学习。

4

4 回答 4

34

将其更改为:

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

但是,我建议遵循本文档中的 Apple 规则。

ARC执行新规则

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

于 2013-02-09T04:37:10.083 回答
8

最安全的方法是__unsafe_unretained直接使用 or 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
    ...
}
于 2015-03-04T01:50:48.507 回答
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;
};
于 2016-10-12T15:00:53.580 回答
0

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

GTMNSString-HTML.m

他们关于将标志添加到每个文件的ARC 兼容性的建议对我有用。-fno-objc-arc

于 2013-07-30T23:07:38.667 回答