我将Swift类添加到旧项目中。它进展顺利,直到我尝试向Swift类添加属性。生成的标题不会编译。
我认为问题是,在生成的代码中,Swift省略了strong
所有权,只将其声明为nonatomic
。这应该足够了,因为@property应该默认为strong
所有权,对吗?
所以基本上这些都是等价的:
@property (nonatomic) NSDate *aDate;
@property (nonatomic, strong) NSDate *aDate;
但是,根据编译器消息,在我的情况下,它似乎默认为assign
而不是strong
。
我正在使用Xcode 6 GM,该项目已启用ARC。
知道为什么它不是默认为strong
?我能以某种方式改变它吗?
答案 0 :(得分:4)
经过多次实验,我发现了一个确定属性默认所有权行为的微妙之处:
strong
。assign
!这也意味着,您不能将-Swift.h
标头导入任何非ARC类,因为它会更改所有属性的行为并发出警告(在我的情况下转换为错误)。 / p>
相当奇怪的恕我直言......
示例:
SourceClass
,ARCClass
(启用ARC)和MRCClass
(禁用ARC)SourceClass.h
有:@property (nonatomic) NSDate *date;
敏锐:
#import "SourceClass.h"
或ARCClass.h
中添加ARCClass.m
,
date
拥有所有权strong
。 @property (nonatomic, strong) NSDate *date;
。#import "SourceClass.h"
添加到MRCClass.h
或MRCClass.m
后,
date
将拥有所有权assign
。 @property (nonatomic, assign) NSDate *date;
。答案 1 :(得分:2)
我确信,有一次,"分配"是默认的,这......
http://cagt.bu.edu/w/images/b/b6/Objective-C_Programming_Language.pdf
"分配 - 指定setter使用简单赋值。这是默认设置。"
......似乎确认了(第59页)。
但是,我也看到一个Apple文档("使用Objective-C&#34编程;)说,"默认情况下,Objective-C属性和变量都保持对其对象的强引用&#34 ;。我相信这一变化是通过引入ARC来实现的。
虽然您说启用了ARC,但如果此项目足够大,可能会出现干扰ARC设置的问题。
我意识到这不是一个明确的答案,但是考虑到这种改变,检查项目设置(或清理项目)可能会有所帮助。