不是一个完整的菜鸟我对iOS编程和Ojbective-C都很陌生。我主要来自C(DSP,微控制器),Delphi XE2 / Pascal,Visual Basic和Java(桌面和Android应用程序)的背景。
我主要通过Apress的书“开始iOS 5开发”学习Cocoa。
最近我观看了WWDC 2012的视频并浏览了他们的一些示例代码,我必须说我对编写应用程序的正确方法感到困惑,更具体地说是@ property / @ synthesize字。
在本书中,大多数(并非全部)示例代码用于定义属性,例如
ViewController.h
@property (strong, nonatomic) NSMutableArray *list;
ViewController.m
@synthesize list;
然后所有代码访问合成列表
self.list
甚至只是
list
现在在我阅读的每个WWDC代码示例中,我看到程序员定义了一个属性,但是在.m文件中他们做了像
这样的事情@synthesize list = _list;
并有时访问
self.list
或
_list
我很困惑。什么是正确的做法?由于Apple程序员都使用下划线,我认为我应该这样做,但为什么这本书没有呢? list和_list之间有区别吗?更重要的是,因为我在同一个对象中,为什么有时使用self.list,有时候使用list / _list。
有时候他们不使用@synthesize,我认为是他们想重新编写自己的访问器和mutator的时候(到目前为止我从来都不是这样)。
我已经在网上阅读了这里和那里,但没有什么能够让我的思绪正确,所以我依靠StackOverflow来点亮这里。
最后但并非最不重要的是,我更喜欢并根据当前的iOS 6最佳实践/编程技术进行回答。无用告诉我如何在旧iOS中正确地做到这一点。
答案 0 :(得分:31)
没有正确的方法。只有你喜欢的风格。
最新的编译器对属性声明进行了隐式的综合。
@synthesize list = _list;
。
您的代码中没有写任何内容。它刚刚发生。
然而,这并没有阻止你明确地这样做。
@synthesize list = somethingelse;
因此,当您通过访问者(list
)要求指向self.list
时,您将获得指向somethingelse
的指针
在大多数情况下,NSMutableArray *thing = self.list
相当于NSMutableArray *thing = somethingelse
仅仅因为Apple使用的风格并不意味着你必须这样做。每家公司通常都有自己的编码风格。
使用@synthesize list;
的主要问题是它会带来您可以编写
self.list = thing
或list = thing
。
前者使用sythesised setList:
访问器而后者不使用,并且在代码中存在相关错误的风险,尽管ARC
没有那么糟糕,因为你没有发生泄漏{ {1}}属性。
使用哪种风格,保持一致,并且与使用其访问者strong
相比,直接了解使用ivar list = thing
的效果
答案 1 :(得分:8)
这是一种语言功能,它的使用在过去几年中迅速发展,这解释了各种形式。使用最新的工具,您可以选择忽略@synthesize
并使事情合理。
在这种情况下,默认行为产生与@synthesize list = _list;
相同的效果。