我的 Xcode 项目有问题。
我有这些行:
typedef struct
{
NSString *escapeSequence;
unichar uchar;
}
我收到了这个错误:
ARC 禁止在结构或联合中使用 Objective-C 对象。
我该如何解决?
我似乎无法找到这如何违反 ARC,但我很想学习。
我的 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
直接使用 or 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 forbids Objective-C objects in struct”。在这种情况下,我们需要使用关键字__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;
};
我刚刚将相同的代码从 Google Toolbox for Mac 集成到我的项目中
他们关于将标志添加到每个文件的ARC 兼容性的建议对我有用。-fno-objc-arc