尽管已标记文件-fno-objc-arc,但ARC仍禁止在结构或联合中使用Objective-C对象


Answers:


170

如果收到此消息,请尝试__unsafe_unretained。仅当未保留结构中的对象时,这才是安全的。示例:如果将OpenFeint与ARC一起使用,则类OFBragDelegateStrings在结构中会显示此错误。

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;

4
当我分配字符串时,它还会产生问题,它显示警告,将保留对象分配给unsafe_unretained变量对象将在分配后释放。当我使用它时崩溃
Deepak Singh Negi 2012年

8
这并不能解决所有问题,该对象通常会立即释放,因此不可用。
Diziet 2012年

是的-这实际上不起作用...解决方案是以某种方式关闭ARC,以
获取衍生源

1
您可以通过在构建阶段将-fno-objc-arc标志添加到文件中来实现。
阿比森

如果struct字段仅是“哑引用”,并且该对象实际上是在其他地方(例如)内部保留(拥有)该NSArray怎么办?在那种情况下,不会立即释放它,但我想知道编译器会说什么(现在无法测试)...
Nicolas Miari 2014年

30

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


怎么样?样品在哪里?

那么为什么不能为小用例构造呢?
Devanshu Saini

13

这是因为arc无法跟踪结构或联合中的对象(因为它们当时位于纯C指针处)。

即使您标记了有问题的文件/类, -fno-objc-arc您仍可能会将受arc控制的对象作为参数传递给它,这很可能会导致内存泄漏。


但是接下来我如何在项目中使用弧形和非弧形文件。例如,我将sharekit用作非弧形对象,并且能够使用实例进行发布。我正在使用的文件是弧文件。
Zsolt

您可以用来-fno-objc-arc在项目中混合ARC文件和非ARC文件,但是如果您在任何地方都使用普通的C结构(例如struct或union),则根本无法使用ARC。
voidStern 2011年

谢谢voidStern ..“但是,如果您在任何地方都使用普通的C结构(例如struct或union),则根本无法使用ARC。” -我认为这不是真的。我正在为自己的文件使用ARC。和非弧形的libharu文件。我解决原始问题的方法是将值分别传递到C文件并在其中创建结构。我认为关键是从弧形过渡到非弧形过渡到弧形。
Zsolt

1
可能有点夸张。本质上,您不能将指向对象的指针放入结构和联合中,这会使ARC感到困惑。通常,可以使用带有结构和/或联合的普通C库。
voidStern

6

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.