什么是声明使用ARC IOS只读属性的正确方法(What is the correct way to

2019-06-24 16:08发布

我是新来的,一般iOS开发,还从来没涉及手动引用计数(保留,释放,自动释放)。 因此我没有什么神奇的ARC正在执行的一个很好的理解。

我想我明白,直到有人问我什么类型的所有制( weakstrongassign等),应给予一个只读属性的对象指向,如:

@property (readonly,nonatomic) NSString* name;

我读到这里关于ARC只读@property问题 ,离开关strong / weak实际上不会编译除非你当你指定了后备变量@synthesize财产; 我只是碰巧被指定后盾伊娃这样的:

@synthesize name = _name;

现在我明白了一个变量的默认“终身资格”强,从这里开始: http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref / DOC / UID / TP40011226-CH1-SW4

因此,削减长话短说-我间接地定义我的财产(readonly,nonatomic,strong)_name伊娃作为隐式声明__strong

我有几个问题:

  1. strong正确的寿命限定使用? 我认为是这样,否则我的支持对象NSString*不会在任何地方拥有,因而将自动释放(从Java土地来这是有道理的,因为所有的引用都默认强)。

  2. 是否有任何其他修饰,其意义在这种情况下,如copyassign

  3. 是否宣告财产(readonly,nonatomic,strong)(readonly,nonatomic)使向耗费属性的代码有什么区别? 例如。 并宣布它没有strong关键字导致待存储的对象的指针作为__unsafe_unretained其中strong属性将被存储在一个__strong指针?

谢谢!

编辑

因此,正如我现在明白了,以下适用于只读属性:

  • 对于非NSObject的*类型(整数,浮点,无效*等)使用(readonly, assign)
  • 对于对象的指针,使用(readonly, strong)(readonly, copy) -这些功能同样为只读属性,但如果你扩展/子类,并重新声明财产,你可能希望复制语义readwrite
  • 对于对象的指针, (readonly, weak)才有意义,如果你将要存储在该属性已经疲弱的指针(该指针一定要坚强其他地方或对象将会被释放)。

Answer 1:

  1. strong是正确的,如果你想保持一个强大的(拥有)参照不管它是什么,你都指向使用。 通常情况下,你想强壮,但为了防止循环引用(尤其是在父/子关系,其中如果父母分给孩子和孩子指向父,他们将永远不会被释放),你有时需要用弱引用。 另外,如果你想保持一个指向对象,你没有自己,但希望它是有效的,只要只存在 ,那么你要使用一个弱指针,因为当它得到由业主释放,指针将被自动地设为nil ,不会指向的内存,它不应该是。

  2. assign使用标量值,并且是默认的制定者。 copy是有道理的,如果你想自动进行对象的副本,并将指针设置为副本而不是指向原来的对象。 它才有意义,要做到这一点,如果你有特定的需求(通常是因为你不希望对象发生变异你)。

  3. 这表明__strong是默认的(因此你不需要指定它),你所提供的链接指向的变量 ,而不是 声明的属性 。 对于声明的属性的默认assign ,因此肯定会有所作为。 如果你想assign但是,这都没有区别是否指定与否(除了仅仅是明确的,这是你想要的)。 编辑 :但是,如雅克指出,这与LLVM 3.1改变,默认是从改变 assignstrong 。 在这种情况下,它使绝对没有什么区别,你是否不指定strong ,并可以离开它,如果你想要的。 我个人认为这是好事,拼出来(尤其是因为有不同的版本之间有冲突),让大家看的代码是在同一页上。 其他人可能虽然在这一点上不同意。 :)

我建议在这里阅读的Objective-C编程语言属性声明节: <document removed by Apple with no direct replacement>



Answer 2:

一个额外的点:性能可以从得到重新声明readonlyreadwrite 。 例如,一个子类可以使一个只读从超读写,类似于许多Cocoa类如何有新增的可变性的子类属性。 同样地,属性可能会公开只读的,但类可能重新声明为一个类扩展内部使用它的读写。 所以,当类设置自己的财产,它可以采取合成二传手是不正确的内存管理和发出适当的键 - 值观察变更通知的优势。

就目前的立场,所有的财产的其他属性必须是一致的。 这是可以想象的是,编译器可以放宽这一要求。 (有些人认为一个bug)无论如何,这是一个原因来声明readonly属性中包含所有权属性strongcopy ,或弱-这样它会匹配readwrite别处重新声明。

关于你的问题3,你问所有权预选赛影响代码调用的getter? 不,没有。



Answer 3:

这些2行代码的工作对我来说:

.h文件中:

@property (nonatomic, readonly, copy) NSString *username;

.m文件:

@property (nonatomic, readwrite, copy) NSString *username;


文章来源: What is the correct way to declare a readonly property for ios using ARC