尽管标记了文件-fno-objc-arc,但ARC禁止结构或联合中的Objective-C对象

Zso*_*olt 84 iphone struct objective-c ios5 automatic-ref-counting

ARC禁止在结构或联合中使用Objective-C对象,尽管标记了文件-fno-objc-arc?为什么会这样?

我假设如果你标记它-fno-objc-arc你没有这个限制.

zei*_*sen 169

如果您收到此消息,请尝试__unsafe_unretained.如果结构中的对象没有保留,那么它是安全的.示例:如果对ARC使用OpenFeint,则类OFBragDelegateStrings在结构中说明此错误.

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;
Run Code Online (Sandbox Code Playgroud)

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解决所有问题,通常会立即释放对象,从而无法使用. (8认同)
  • 当我分配字符串时它也会产生问题,它显示警告将保留对象分配给unsafe_unretained变量对象将在赋值后释放.当我使用它崩溃 (4认同)

Ján*_*nos 30

您可以创建一个Objective-C类来管理数据,不是使用结构.


voi*_*ern 13

这是因为弧不能跟踪结构或联合中的对象(因为它们在那时是普通的C指针).

即使您标记了相关的文件/类, -fno-objc-arc您仍然可以将由arc控制的对象作为参数传递给它,这很可能会导致内存泄漏.


Hir*_*awa 6

看起来现在这样可以正常工作了,可能是在更改之后

即,您可以在C结构中放置指向Objective-C对象的普通(强)指针。它由ARC管理,例如,在销毁结构时不保留它。已验证:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)

  • [LLVM的新增功能](https://developer.apple.com/videos/play/wwdc2018/409/?time=218)-WWDC 2018 (2认同)