31

不是一个完整的菜鸟 我对 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;

然后所有代码访问综合列表与

self.list

甚至简单地

list

现在,在我阅读的每个 WWDC 代码示例中,我看到程序员定义了一个属性,但是在 .m 文件中,他们执行了类似的操作

@synthesize list = _list;

有时访问

self.list

或者

_list

我很困惑。什么是正确的做法?由于 Apple 程序员都使用下划线,我认为我应该这样做,但为什么这本书没有?list 和 _list 有区别吗?而且,由于我在同一个对象中,为什么有时使用 self.list 有时使用 list/_list。

有时他们不使用@synthesize,我认为这是他们想要重新编写自己的访问器和修改器的时候(到目前为止,我从来没有这样做过)。

我在网上到处阅读,但没有什么足够清楚让我的想法正确,所以我指望 StackOverflow 在这里带来光明。

最后但并非最不重要的一点是,我更喜欢并根据当前的 iOS 6 最佳实践/编程技术进行回答。没用告诉我如何在旧版 iOS 中正确操作。

4

2 回答 2

31

没有正确的方法。只有您喜欢的风格。

最新的编译器对属性声明进行隐式综合。

@synthesize list = _list;.

你的代码中从来没有写过任何东西。它只是发生。

然而,这并不能阻止你明确地这样做。

@synthesize list = somethingelse;

list因此,当您通过访问器 ( )请求指向的指针时,self.list您将获得指向somethingelse

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

仅仅因为 Apple 使用一种风格并不意味着你必须这样做。每个公司通常都有自己的编码风格。

使用的主要问题@synthesize list;是它带来了您可以编写的风险

self.list = thinglist = thing

前者使用综合setList:访问器,而后者不使用,并在您的代码中放置相关错误的风险,尽管它并不ARC像您没有发生strong属性泄漏那样糟糕。

无论您使用什么样式,保持一致并注意直接使用 ivarlist = thing与使用其访问器相比的效果self.list = thing

于 2012-10-29T12:00:02.793 回答
8

这是一种语言功能,在过去几年中其使用迅速发展,它解释了各种形式。使用最新的工具,您可以选择忽略@synthesize并使事情合理运行。

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

于 2012-10-29T11:46:10.860 回答