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

Nic*_*ard 15 xcode warnings ios automatic-ref-counting

我刚刚将我的应用程序转换为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;
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 20

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

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


mat*_*att 7

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

在Xcode 4.2,转换器会提供改(nonatomic, retain)(nonatomic, strong).但是在Xcode 4.3中,它提供了将其更改为(nonatomic); 我想,如果你不希望出现这种情况,换retainstrong是给你转换之前.

另一方面,在Xcode 4.2中,(nonatomic)单独对于合成属性是绝对非法的; 在Xcode 4.3中,它不是:你得到一个警告,但它假设你的意思assign,所以它不是非法的.

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

  • 这没有意义.现在默认为STRONG,而不是分配.因此(非原子)应该意味着(非原子的,强的).警告是错误的. (2认同)