Objective c ARC禁止合成未指定所有权或存储的属性

Objective c ARC禁止合成未指定所有权或存储的属性,objective-c,memory-management,properties,compiler-errors,automatic-ref-counting,Objective C,Memory Management,Properties,Compiler Errors,Automatic Ref Counting,我已经创建了UIColor的@属性 @property (nonatomic) UIColor *color; 然后我试着合成它: @synthesize color = _color; 但我收到一个错误: ARC禁止合成具有未指定所有权或存储属性的Objective-C对象的属性 这是什么意思 我要做的就是为更改颜色的UIColor对象创建一个属性。您必须在属性声明中指定strong或弱存储(在非原子旁边)。将属性声明更改为: @property(非原子,强)UIColor*color 让

我已经创建了
UIColor
@属性

@property (nonatomic) UIColor *color;
然后我试着合成它:

@synthesize color = _color;
但我收到一个错误:

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

这是什么意思


我要做的就是为更改颜色的
UIColor
对象创建一个属性。

您必须在属性声明中指定
strong
存储(在
非原子
旁边)。

将属性声明更改为:

@property(非原子,强)UIColor*color

让ARC知道它应该被保留。这将在ARC之前编译而没有
strong
,但这将是危险的,因为默认值为
assign
,并且颜色将被释放,除非它保留在其他位置


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

@WilliamSham您不需要对所有指针执行此操作,只需对属性执行此操作。默认情况下,本地作用域中的指针是强引用,但您可以通过使用_-weak命令ARC将指针视为弱引用。@JoePasq不需要始终指定存储。检查我在其他答案和问题中的评论。您可能必须给出完整的类声明和实现,因为这似乎是有效的。默认情况下,属性中的存储是强的,除非它是一个块,您必须在该块中手动将其指定为
copy
。除非该属性是一个块,在这种情况下,必须明确将其称为
copy
,否则这不是必需的。“所以问题是另外一回事儿了。”维克拉姆饶,这个问题已经有2.5年历史了。在被询问时,需要合成属性来声明存储类,默认值为
assign
@Brian无论如何,最好更新您接受的答案,因为人们可能会通过谷歌看到它。这些不知道的开发人员可能认为他们需要明确地编写它。到目前为止,这个错误主要用块来显示,它需要是
copy
。默认情况下,对象是
strong
,基本类型如
BOOL
NSInteger
等-
assign
,不太可能有人在对象/基本类型中看到此错误。@Vive实际上您不再需要声明块
copy
-现在可以声明它们
strong
。如果块已经被复制到堆中,
copy
的行为总是像
strong
(两者都只是保留了块)。如果块仍然在堆栈上,
copy
用于将其复制到堆中,而
strong
用于不执行任何操作。LLVM开发者认为一个bug,不管苹果的文档怎么说,如果块在堆栈上,那么现在的
strong
行为类似于
copy
,就像
copy
行为类似于
strong
,如果它在堆上,那么它就不再有区别了,只有
弱的
有。@Brian即使在被问到的时候,你的答案仍然是错的。的确,ARC之前的默认值是
assign
,但是不需要存储类,因为如果需要,就根本不会有默认值。默认的意思是“除非我说别的话,否则接受这个”。未为创建的存储类提供
assign
属性。可能不是您想要的,但是编译器没有因此抛出错误。为什么应用默认行为是错误的?