我已经搜索了很多关于 ObjC 访问器和合成访问器的问题,但都无济于事。这个问题更像是一个“帮我解决一个问题”的问题;我不希望有一个答案,但我宁愿寻找专家来权衡这一论点。
在 Cocoa Touch 类中,我会写一些这样的代码(其中 soundEffects
是一个合成的 NSArray 属性):
id foo = [self.soundEffects objectAtIndex:1];
一位同事让我解释为什么上面的代码比这行更好:
id foo = [soundEffects objectAtIndex:1];
嗯,从功能上来说,这没什么不同。
我对前者的论据如下:
self.soundEffects
告诉所有其他处理代码的编码人员这是一个 iVar,而不是局部范围的变量。如果需要,我们可以将自定义逻辑放入
soundEffects
getter 访问器中。没有具体原因,在 Obj-C 工作一年后“感觉”这是正确的事情。
他接受论点 #1 和 #2 是有效的,但也给出了对立点:
这不是代码膨胀吗?
难道不应该允许一个类直接与它自己的 iVar 对话,而不必调用它自己的方法(getter)吗?
有人要吗?
最佳答案
我个人决定为 ivars 使用下划线前缀,这种综合
@synthesize name = _name;
这样我就不会混淆它们。不使用 self 的主要问题是这段代码
_name = ...
非常不同于
self.name = ...
当@property 使用保留选项时。第一个不保留对象,第二个调用保留的合成setter。
唯一一次有很大不同的是赋值,所以我倾向于一直使用 self.
,所以我确保在赋值时使用它。
关于objective-c - 在 iOS 上的 Objective-C 中,使用合成 getter 时 "self.foo"和 "foo"之间的(样式)区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3494157/