ARC 禁止合成具有未指定所有权或存储的财产
Posted
技术标签:
【中文标题】ARC 禁止合成具有未指定所有权或存储的财产【英文标题】:ARC forbids synthesizing a property with unspecified ownership or storage 【发布时间】:2012-01-17 15:18:44 【问题描述】:我创建了@property
的UIColor
,
@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
,原始类型如 BOOL
、NSInteger
等 - assign
,任何人都不太可能在对象/原始类型中看到此错误。
@Vive 实际上,您不再需要声明块 copy
- 现在声明它们 strong
就可以了。如果块已经被复制到堆中,copy
的行为总是像strong
一样(两者都只是保留了块)。如果块仍然在堆栈上,copy
曾经将其复制到堆中,而 strong
过去什么都不做。 LLVM 开发人员认为这是一个错误,不管 Apple 的文档说什么,现在 strong
的行为类似于 copy
如果块在堆栈上,就像 copy
的行为类似于 strong
如果它在堆上 - IOW 它没有区别现在,只有weak
可以。
@Brian 即使在被问到的时候,你的回答仍然是错误的。的确,ARC 之前的默认值曾经是assign
,但不需要存储类,就好像它是必需的一样,根本就没有默认值。默认的意思是“除非我说别的,就拿这个”。不给存储类创建了assign
属性。也许不是你想要的,但编译器并没有因此引发错误。为什么应用默认行为会出错?【参考方案2】:
您必须在属性声明中指定strong
或weak
存储(在nonatomic
旁边)。
【讨论】:
@WilliamSham 您不需要为所有指针执行此操作,仅对属性执行此操作。默认情况下,本地范围内的指针是强引用,但您可以使用 __weak 指示 ARC 将指针视为弱引用。 @JoePasq 不需要始终指定存储。在其他答案和问题中查看我的 cmets。以上是关于ARC 禁止合成具有未指定所有权或存储的财产的主要内容,如果未能解决你的问题,请参考以下文章
ARC:“指向没有明确所有权的非常量类型 'id' 的指针”
在哪些情况下我们需要在 ARC 下编写 __autoreleasing 所有权限定符?