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

Set*_*ker 11 xcode

我的Xcode项目有问题.

我有这些线:

typedef struct
{
    NSString *escapeSequence;
    unichar uchar;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

我该如何解决?

我似乎无法找到这是如何违反ARC的,但我很乐意学习.

bit*_*com 34

将其更改为:

typedef struct
{
    __unsafe_unretained NSString *escapeSequence;
    unichar uchar;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)

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

ARC实施新规则

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


小智 7

最安全的方法是使用__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
    ...
}
Run Code Online (Sandbox Code Playgroud)