Objective-C编码指南

时间:2012-05-24 21:37:13

标签: objective-c ios cocoa-touch

所以在指南中说:

  

对于仅在iOS上运行的代码,首选使用自动合成的实例变量。

     

合成实例变量时,请使用@synthesize var = var_;因为这可以防止意外调用var = blah;当self.var = blah;是打算。

 // Header file
@interface Foo : NSObject
// A guy walks into a bar.
@property(nonatomic, copy) NSString *bar;
@end

// Implementation file
@interface Foo ()
@property(nonatomic, retain) NSArray *baz;
@end

@implementation Foo
@synthesize bar = bar_;
@synthesize baz = baz_;
@end

问题是,这仅适用于公共变量还是私有?它在文档中并不是很清楚,但是想对“为什么”这只仅仅是针对公共或私人的问题有所了解?我认为这对所有公共/私人都有意义,所以你不要搞砸ivars和使用财产

2 个答案:

答案 0 :(得分:1)

我认为所讨论的变量是公开的还是私人的并不特别重要。使用不同名称进行合成的做法使您在直接访问变量时显式,而不是使用生成的访问器方法。

也许你提出的问题背后有一个不同的问题:我是否应该通过访问者或直接访问私有ivars?我认为大多数熟练的iOS开发人员倾向于使用访问者,除非有某些特殊原因不要(表现,避免像KVO这样的副作用)。这样做更具有前瞻性,并允许底层实现的灵活性。以非常小的方式,您编写的是接口而不是实现。

值得指出的是,Clang的默认行为将在未来发生变化,以便默认情况下将属性支持的ivars合成为_foo 。显然,这些权力应该考虑强调将ivars作为最佳实践。

答案 1 :(得分:0)

我很确定这很大程度上取决于个人偏好,所以这是我的,因为它们的价值:

  • 我喜欢区分公共属性和“私有”实例变量。
  • 除了初始化(以及在手动创建的访问器方法中,出于显而易见的原因),始终通过其访问器访问属性。因此,支持ivar中的下划线很有用,而且在我日常使用这些属性时并不是真正的问题。
  • 实例变量用于保存方法内部使用的状态,但不能(直接)保存在其他类中。
  • 我非常喜欢在.m文件中声明我的实例变量。漂亮,干净,简单(在.h和.m之间来回切换,以宣布伊娃)。
  • 我发现这种区别有助于我清醒并确定某个属性是否属于代理应该直接获取和/或设置(.h中的属性),或者它是否真的只是帮助我获取方法实现工作(.m中的伊娃)。

我同意保罗。这种一致性是你的朋友,但对我来说,区别也是朋友。