正在修复在结构中使用Objective-C对象时的ARC错误



我的Xcode项目有问题。

我有以下线路:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}

我得到了这个错误:

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

我该怎么修?

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

将其更改为:

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

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

ARC实施新规则

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

最安全的方法是使用__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
    ...
}

当我们在启用ARC的Objective C中定义C结构时,我们会得到错误"ARC禁止结构中的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;
};

我刚刚从Mac 的谷歌工具箱中将相同的代码集成到我的项目中

GTMNS字符串HTML.m

他们提出的在每个文件中添加-fno-objc-arc标志的ARC兼容性建议对我来说很有效。

最新更新