为什么Obj-C属性默认所有权"分配"而不是强大的"

时间:2014-09-18 16:26:47

标签: ios objective-c xcode swift xcode6

我将Swift类添加到旧项目中。它进展顺利,直到我尝试向Swift类添加属性。生成的标题不会编译。

enter image description here

我认为问题是,在生成的代码中,Swift省略了strong所有权,只将其声明为nonatomic。这应该足够了,因为@property应该默认为strong所有权,对吗?

所以基本上这些都是等价的:

  • @property (nonatomic) NSDate *aDate;
  • @property (nonatomic, strong) NSDate *aDate;

但是,根据编译器消息,在我的情况下,它似乎默认为assign而不是strong

我正在使用Xcode 6 GM,该项目已启用ARC。

知道为什么它不是默认为strong?我能以某种方式改变它吗?

2 个答案:

答案 0 :(得分:4)

经过多次实验,我发现了一个确定属性默认所有权行为的微妙之处:

  • 如果将头文件仅导入到已启用ARC的类中,并且未声明默认所有权,则此头文件中属性的所有权为strong
  • 如果将头文件导入至少一个非ARC 类,并且没有声明默认所有权,则该属性的所有权为assign

这也意味着,您不能将-Swift.h标头导入任何非ARC类,因为它会更改所有属性的行为并发出警告(在我的情况下转换为错误)。 / p>

相当奇怪的恕我直言......


示例:

  • 我们有课程SourceClassARCClass(启用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.hMRCClass.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设置的问题。

我意识到这不是一个明确的答案,但是考虑到这种改变,检查项目设置(或清理项目)可能会有所帮助。