应用转换为ARC,现在收到有关我的属性的警告

时间:2012-03-07 20:26:21

标签: ios xcode automatic-ref-counting warnings

我刚将我的应用转换为ARC,虽然它构建得很好,但我得到了600条警告,所有警告都属于我的属性。如:

  

默认属性'assign'不适合非gc对象

     

未指定'assign','retain'或'copy'属性 - 'assign'是   假设

Screenshot for warning

在Xcode转换我的代码之后,这就是我的属性:

@property (nonatomic) EKEventStore *eventStore;
@property (nonatomic) EKCalendar *defaultCalendar;
@property (nonatomic) UIActionSheet *currentActionSheet;
@property (nonatomic) UILabel *noEventLabel;

有人谈到需要为所有这些添加strong。是这样的吗? Xcode忘了添加一些东西吗?

3 个答案:

答案 0 :(得分:20)

ARC是对的。你不能拥有没有内存管理资格;你必须说出分配,保留(或强大,这是相同的东西),或弱。

以前,assign是默认值。但这可能不是你想要的,因为它是最糟糕的选择 - 它是一种旧式的非ARC弱引用。您要么需要智能ARC弱引用(当对象不存在时为nil)或强引用(由ARC为您管理内存)。

答案 1 :(得分:7)

很抱歉添加第二个答案,但事实证明这比我想象的要复杂得多。事实证明你在Xcode 4.3中看到了改变的行为(可能是一个错误?)。

在Xcode 4.2中,转换器可以将(nonatomic, retain)更改为(nonatomic, strong)。但是在Xcode 4.3中,它提供了将其更改为(nonatomic);我想如果您不想这样做,在转换之前将retain更改为strong取决于您。

另一方面,在Xcode 4.2中,仅(nonatomic)对于合成属性来说绝对是非法的;在Xcode 4.3中,它不是:你得到一个警告,但它假设你的意思是assign,因此它不是非法的。

因此,ARC在LLVM 3.1中的工作方式发生了变化,并伴随着Xcode 4.3 ARC转换器的变化。

答案 2 :(得分:3)

我认为答案是错误的。

在Xcode 4.3中,您会收到警告。但是,它假设您的意思是RETAIN。保留是ARC下代码的新默认值。有人告诉我,xcode正在解决这个问题。

如果我错了,请纠正我。