HpT*_*erm 31 properties objective-c ios
不是一个完整的菜鸟我对iOS编程和Ojbective-C都很陌生.我主要来自C(DSP,微控制器),Delphi XE2/Pascal,Visual Basic和Java(桌面和Android应用程序)的背景.
我主要从Apress的"Beginning iOS 5 Development"一书中学习了Cocoa.
最近我观看了WWDC 2012的视频并浏览了他们的一些示例代码,我必须说我对编写应用程序的正确方法感到困惑,更具体地说是@ property/@ synthesize字.
在本书中,大多数(并非全部)示例代码用于定义属性,例如
ViewController.h
@property (strong, nonatomic) NSMutableArray *list;
ViewController.m
@synthesize list;
Run Code Online (Sandbox Code Playgroud)
然后所有代码访问合成列表
self.list
Run Code Online (Sandbox Code Playgroud)
甚至简单地说
list
Run Code Online (Sandbox Code Playgroud)
现在在我阅读的每个WWDC代码示例中,我看到程序员定义了一个属性,但是在.m文件中他们做了类似的事情
@synthesize list = _list;
Run Code Online (Sandbox Code Playgroud)
并且有时访问
self.list
Run Code Online (Sandbox Code Playgroud)
要么
_list
Run Code Online (Sandbox Code Playgroud)
我很迷惑.什么是正确的做法?由于Apple程序员都使用下划线,我认为我应该这样做,但为什么这本书没有呢?list和_list之间有区别吗?更重要的是,因为我在同一个对象中为什么有时使用self.list,有时候使用list/_list.
有时他们不使用@synthesize,我认为是时候他们想重新编写自己的访问器和mutators(到目前为止我从来都不是这样).
我已经在网上阅读了这些内容,但没有什么能够让我的思路正确,所以我依靠StackOverflow来实现这一点.
最后但并非最不重要的是,我更喜欢并根据当前的iOS 6最佳实践/编程技术进行回答.没用,告诉我如何在旧的iOS中正确地做到这一点.
War*_*ton 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因为你没有发生strong属性的泄漏.
你使用什么样的风格,保持一致,并意识到list = thing与使用它的存取器相比,直接使用ivar的效果self.list = thing
这是一种语言功能,其使用在过去几年中迅速发展,这解释了各种形式.使用最新的工具,您可以选择忽略@synthesize并使事情合理运行.
在这种情况下,默认行为产生的效果与@synthesize list = _list;.
| 归档时间: |
|
| 查看次数: |
29157 次 |
| 最近记录: |