我的 Xcode 项目遇到问题。
我有这些台词:
typedef struct
{
NSString *escapeSequence;
unichar uchar;
}
我收到此错误:
ARC 禁止在结构或联合中使用 Objective-C 对象。
我该如何修复它?
我似乎无法找到这如何违反 ARC,但我很想学习。
更改为:
typedef struct
{
__unsafe_unretained NSString *escapeSequence;
unichar uchar;
}MyStruct;
但是,我建议遵循本文档中的 Apple 规则。
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;
};
正如其他评论者提到的,从 XCode 10 开始现在允许这样做。以前,在启用 ARC 的结构中拥有指向 obj-c 对象的指针的唯一方法是使用
unsafe_unretained
。
请注意,即使进行了这些更改,它仍然有点风险。在取消分配堆分配的结构之前,您必须注意显式清空任何 objc 指针,否则 ARC 将无法减少这些指针的引用计数。