ARC 禁止合成具有未指定所有权或存储的财产

Posted

技术标签:

【中文标题】ARC 禁止合成具有未指定所有权或存储的财产【英文标题】:ARC forbids synthesizing a property with unspecified ownership or storage 【发布时间】:2012-01-17 15:18:44 【问题描述】:

我创建了@propertyUIColor

@property (nonatomic) UIColor *color;

然后我尝试合成它:

@synthesize color = _color;

但我收到一个错误:

ARC 禁止合成具有未指定所有权或存储属性的 Objective-C 对象的属性

这是什么意思?

我想要做的只是为改变颜色的UIColor 对象创建一个属性。

【问题讨论】:

您可能必须给出完整的类声明和实现,因为这似乎是有效的。属性中的默认存储是强存储,除非它是您必须手动将其指定为 copy 的块。 【参考方案1】:

将您的属性声明更改为:

@property (nonatomic,strong) UIColor *color;

以便 ARC 知道它应该被保留。这将在 ARC 之前不使用 strong 进行编译,但它会很危险,因为默认值为 assign 并且颜色会被释放,除非它保留在其他地方。

我强烈推荐关于 ARC 的 WWDC2011 视频。

【讨论】:

这不是必需的,除非该属性是一个块,在这种情况下,它必须明确提及为copy。所以问题是另外一回事。 @VikramRao,这个问题已有 2.5 年历史。在被问到的时候,需要综合属性来声明存储类,默认是assign @Brian 无论如何,最好更新您接受的答案,因为人们可能会通过谷歌看到它。这些不知道的开发人员可能认为他们需要明确地编写它。至于现在这个错误主要是用块显示的,它需要是copy。默认情况下,对象为 strong,原始类型如 BOOLNSInteger 等 - assign,任何人都不太可能在对象/原始类型中看到此错误。 @Vive 实际上,您不再需要声明块 copy - 现在声明它们 strong 就可以了。如果块已经被复制到堆中,copy 的行为总是像strong 一样(两者都只是保留了块)。如果块仍然在堆栈上,copy 曾经将其复制到堆中,而 strong 过去什么都不做。 LLVM 开发人员认为这是一个错误,不管 Apple 的文档说什么,现在 strong 的行为类似于 copy 如果块在堆栈上,就像 copy 的行为类似于 strong 如果它在堆上 - IOW 它没有区别现在,只有weak 可以。 @Brian 即使在被问到的时候,你的回答仍然是错误的。的确,ARC 之前的默认值曾经是assign,但不需要存储类,就好像它是必需的一样,根本就没有默认值。默认的意思是“除非我说别的,就拿这个”。不给存储类创建了assign 属性。也许不是你想要的,但编译器并没有因此引发错误。为什么应用默认行为会出错?【参考方案2】:

您必须在属性声明中指定strongweak 存储(在nonatomic 旁边)。

【讨论】:

@WilliamSham 您不需要为所有指针执行此操作,仅对属性执行此操作。默认情况下,本地范围内的指针是强引用,但您可以使用 __weak 指示 ARC 将指针视为弱引用。 @JoePasq 不需要始终指定存储。在其他答案和问题中查看我的 cmets。

以上是关于ARC 禁止合成具有未指定所有权或存储的财产的主要内容,如果未能解决你的问题,请参考以下文章

ARC:“指向没有明确所有权的非常量类型 'id' 的指针”

获取具有“损坏”权限的文件的所有权

在哪些情况下我们需要在 ARC 下编写 __autoreleasing 所有权限定符?

2016 2 - 23 arc中的所有权修饰符(_strong修饰符与_weak修饰符)

内存管理的思考方式2(ARC下)

ARC 和自动释放