我的Xcode项目存在问题。
我有以下几行:
typedef struct
{
NSString *escapeSequence;
unichar uchar;
}
我收到此错误:
ARC禁止结构或联合中的Objective-C对象。
我该如何解决?
我似乎无法发现这是如何违反ARC的,但我很乐意学习。
答案 0 :(得分:32)
将其更改为:
typedef struct
{
__unsafe_unretained NSString *escapeSequence;
unichar uchar;
}MyStruct;
但是,我建议遵循this documentation中的Apple规则。
ARC强制执行新规则
你不能在C结构中使用对象指针 您可以创建一个Objective-C类来代替管理数据,而不是使用结构。
答案 1 :(得分:7)
最安全的方法是使用__unsafe_unretained
或直接使用CFTypeRef
,然后使用__bridge
,__bridge_retained
和__bridge_transfer
。
e.g
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
...
}
答案 2 :(得分:0)
我刚从Google Toolbox for Mac将相同的代码集成到我的项目中
他们建议ARC Compatibility为每个文件添加-fno-objc-arc
标志。
答案 3 :(得分:0)
当我们使用ARC启用在Objective C中定义C结构时,我们得到错误" ARC禁止在struct"中使用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;
};