objective-c - 在 iOS 上的 Objective-C 中,使用合成 getter 时 "self.foo"和 "foo"之间的(样式)区别是什么?

标签 objective-c properties setter getter

我已经搜索了很多关于 ObjC 访问器和合成访问器的问题,但都无济于事。这个问题更像是一个“帮我解决一个问题”的问题;我不希望有一个答案,但我宁愿寻找专家来权衡这一论点。

在 Cocoa Touch 类中,我会写一些这样的代码(其中 soundEffects 是一个合成的 NSArray 属性):

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

一位同事让我解释为什么上面的代码比这行更好:

id foo = [soundEffects objectAtIndex:1];

嗯,从功能上来说,这没什么不同。

我对前者的论据如下:

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

  2. 如果需要,我们可以将自定义逻辑放入 soundEffects getter 访问器中。

  3. 没有具体原因,在 Obj-C 工作一年后“感觉”这是正确的事情。

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

  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/

相关文章:

ruby - 将 setter 与 instance_variable_set 一起使用

ios - 无法以编程方式选择表格 View 单元格

iphone - 滚动时 UITableViewCell 图像发生变化

objective-c - 比写几十个空的 getter 更好的方法?

javascript - 将全局变量抽象为属性?

django - 为非属性模型字段创 build 置器的正确方法是什么

ios - 在 iPhone App 中如何检测设备的屏幕分辨率

ios - NSFetchedResultsController 太慢

javascript - 使用保存键按属性值对 Javascript 对象数组进行排序

c++ - C++ 中静态类变量的静态或非静态 getter/setter