为了账号安全,请及时绑定邮箱和手机立即绑定

在iOS上的Objective-C中,使用合成的吸气剂时,“ self.foo”和“ foo”之间的

/ 猿问

在iOS上的Objective-C中,使用合成的吸气剂时,“ self.foo”和“ foo”之间的

烙印99 2019-11-19 14:45:38

我已经搜索了许多关于ObjC访问器和综合访问器的问题,但是都没有用。这个问题更像是一个“帮助我解决问题”的问题;我不希望有一个答案,但我希望找专家来论证。


在Cocoa Touch类中,我将编写如下代码(其中soundEffects是合成的NSArray属性):


id foo = [self.soundEffects objectAtIndex:1];

一位同事让我解释一下,为什么上述内容比这行更好:


id foo = [soundEffects objectAtIndex:1];

好吧,从功能上来说,没有什么不同。


我对前者的论据如下:


self.soundEffects 告诉处理该代码的所有其他编码器这是一个iVar,而不是局部范围的变量。


如果需要,可以将自定义逻辑放入soundEffectsgetter访问器中。


在没有具体原因的情况下,在Obj-C工作了一年后,感觉就像做正确的事情。


他接受参数#1和#2是有效的,但也给出了对点:


这不只是代码膨胀吗?


是否应该允许类直接与自己的iVar对话而不必自己调用方法(getter)?


有没有人?


查看完整描述

3 回答

?
慕盖茨1488219

你1点是不完全正确:self.soundEffects不是伊娃,虽然它可能会发生,给你一些东西, -因为它在你的合成的情况下NSArray在此刻

这反过来意味着您的第二点是问题的症结所在-如果您通过访问器路由所有访问,则所有内容都被很好地封装了,以后您可以自由地修改实现而不必担心副作用。

这也是使用增变器的好习惯,因此您可以保持一致的内存管理。

在大多数情况下,我会说这是最好通过路由self.property的一切一个属性,并限制事情是严格内部直接伊娃访问。但是,我承认在某些情况下(尤其是对于不使用retaincopy语义的事物),它可能更多是样式首选项。


查看完整回答
反对 回复 2019-11-19
?
慕仰8121524

我个人决定对下划线使用下划线前缀,并且这种综合


@synthesize name = _name;

这样我就不会混淆它们。不使用自我的主要问题是此代码


_name = ...


self.name = ...

@property使用保留选项时。第一个不保留对象,第二个调用保留的合成设置器。


唯一有很大不同的时间就是分配,因此我倾向于一直使用self.所有时间,因此请确保对分配执行此操作。


查看完整回答
反对 回复 2019-11-19
?
慕仰0522570

自我声音效果

通过setter / getter设置/获取实例变量,因此,如果我们想在其值更改时执行一些自定义操作,则该逻辑可以进入其getter / setter。

同样根据ios 6,ivar对应于


@property(nonatomic)NSArray * propertyName;

将会


_propertyName

所以我想你不能使用


id foo = [soundEffects objectAtIndex:1];

不再。不过不确定。相反,您应该使用

id foo = soundEffects [1];


查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信