我的Xcode项目有问题。
我有以下线路:
typedef struct
{
NSString *escapeSequence;
unichar uchar;
}
我得到了这个错误:
ARC禁止在结构或联合中使用Objective-C对象。
我该怎么修?
我似乎不知道这是如何违反ARC的,但我很想学习。
将其更改为:
typedef struct
{
__unsafe_unretained NSString *escapeSequence;
unichar uchar;
}MyStruct;
但是,我建议遵循本文档中的苹果规则。
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;
};
我刚刚从Mac 的谷歌工具箱中将相同的代码集成到我的项目中
GTMNS字符串HTML.m
他们提出的在每个文件中添加-fno-objc-arc
标志的ARC兼容性建议对我来说很有效。