ARC禁止在结构或联合中使用Objective-C对象,尽管标记了文件-fno-objc-arc? 为什么会这样?
我假设你将它标记为-fno-objc-arc,你没有这个限制。
答案 0 :(得分:171)
如果您收到此消息,请尝试__unsafe_unretained。如果结构中的对象没有保留,那么它是安全的。 示例:如果对ARC使用OpenFeint,则类OFBragDelegateStrings在结构中显示此错误。
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
到
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
答案 1 :(得分:30)
而不是结构,您可以创建 Objective-C类来代替管理数据。
答案 2 :(得分:13)
这是因为arc无法跟踪结构或联合中的对象(因为它们在那时是普通的C指针)。
即使您使用-fno-objc-arc
标记了相关文件/类,您仍然可以将arc控制的对象作为参数传递给它,这很可能会导致内存泄漏。
答案 3 :(得分:4)
看起来现在这样可以正常工作了,可能在this change之后。
即,您可以在C结构中放置指向Objective-C对象的普通(强)指针。它是由ARC管理的,例如,在销毁结构时不会保留它。验证:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)