在iOS中需要解释@ property / @ synthesize

不是一个完整的noob我对iOS编程和Ojbective-C相当新。 我主要来自C(DSP,微控制器),Delphi XE2 / Pascal,Visual Basic和Java(桌面和Android应用程序)的背景。

我主要是从Apress那里学习Cocoa的书“Beginning iOS 5 Development”。

最近,我观看了WWDC 2012的video,并通过了他们的一些示例代码,我必须说我对编写我的应用程序的正确方式感到困惑,更具体地说,我对@ property / @综合词语感到困惑。

在本书中,绝大多数(并非全部)示例代码用来定义一个属性,例如

ViewController.h @property (strong, nonatomic) NSMutableArray *list; ViewController.m @synthesize list; 

然后所有的代码访问合成列表

 self.list 

甚至简单地说

 list 

现在,在我阅读的每一个WWDC代码示例中,我都看到程序员定义了一个属性,但是在.m文件中他们会这样做

 @synthesize list = _list; 

和访问有时

 self.list 

要么

 _list 

我很困惑。 什么是正确的做法? 作为苹果程序员都使用下划线,我认为我应该这样做,但为什么书没有? list和_list有区别吗? 还有更多,因为我在同一个对象为什么有时使用self.list和有时列表/ _list。

有时候他们不使用@synthesize,我假定他们想要重写他们自己的访问器和增变器(这从来不是我的情况)。

我已经在网上阅读,但没有足够清楚的设置我的想法,所以我指望StackOverflow在这里带来光明。

最后但并非最不重要的,我更喜欢和回答基于当前的iOS 6最佳实践/编程技术。 无用的告诉我如何在旧的iOS中正确地做到这一点。

没有正确的方法。 只有你的首选风格。

最新的编译器在属性声明上做了一个隐式综合。

@synthesize list = _list;

没有什么是你的代码写的。 它恰好发生。

但是,这并不能阻止你明确地这样做。

@synthesize list = somethingelse;

所以当你通过访问器( self.list )请求一个指向list的指针时,你会得到一个指向somethingelse的指针

在大多数情况下, NSMutableArray *thing = self.list相当于NSMutableArray *thing = somethingelse

只是因为苹果使用的风格并不意味着你必须这样做。 每家公司通常都有自己的编码风格。

使用@synthesize list;的主要问题@synthesize list; 这是它可能会写的风险

self.list = thinglist = thing

前者使用setList: accessor,而后者则不使用,并在代码中放置相关错误的风险,虽然它不像ARC那样糟糕,因为你不会为strong属性发生泄漏。

你使用什么风格,保持一致,并注意使用伊娃直接list = thing的效果相比,使用它的访问者self.list = thing

这是一个在过去几年迅速发展起来的语言特征,它解释了各种forms。 使用最新的工具,您可以select忽略@synthesize并让事情合理地工作。

在这种情况下的默认行为会产生与@synthesize list = _list;相同的效果@synthesize list = _list;