我刚将我的应用转换为ARC
,虽然它构建得很好,但我得到了600条警告,所有警告都属于我的属性。如:
默认属性'assign'不适合非gc对象
未指定'assign','retain'或'copy'属性 - 'assign'是 假设
在Xcode转换我的代码之后,这就是我的属性:
@property (nonatomic) EKEventStore *eventStore;
@property (nonatomic) EKCalendar *defaultCalendar;
@property (nonatomic) UIActionSheet *currentActionSheet;
@property (nonatomic) UILabel *noEventLabel;
有人谈到需要为所有这些添加strong
。是这样的吗? Xcode忘了添加一些东西吗?
答案 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正在解决这个问题。
如果我错了,请纠正我。