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

问题描述 投票:0回答:5

我的 Xcode 项目遇到问题。

我有这些台词:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}

我收到此错误:

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

我该如何修复它?

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

xcode
5个回答
34
投票

更改为:

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

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

ARC 实施新规则

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


8
投票

最安全的方法是使用

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

1
投票

当我们在启用 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;
};

0
投票

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

GTMNSString-HTML.m

他们对 ARC 兼容性 的建议,即向每个文件添加

-fno-objc-arc
标志对我来说很有效。


0
投票

正如其他评论者提到的,从 XCode 10 开始现在允许这样做。以前,在启用 ARC 的结构中拥有指向 obj-c 对象的指针的唯一方法是使用

unsafe_unretained

请注意,即使进行了这些更改,它仍然有点风险。在取消分配堆分配的结构之前,您必须注意显式清空任何 objc 指针,否则 ARC 将无法减少这些指针的引用计数。

© www.soinside.com 2019 - 2024. All rights reserved.