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

Posted

技术标签:

【中文标题】需要解释 iOS 中的 @property/@synthesize【英文标题】:Need explanation on @property/@synthesize in iOS 【发布时间】:2012-10-29 11:40:54 【问题描述】:

不是一个完整的菜鸟 我对 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,我认为这是他们想要重新编写自己的访问器和修改器的时候(到目前为止我从来没有这种情况)。

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

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

【问题讨论】:

【参考方案1】:

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

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

@synthesize list = _list;

您的代码中从未写过任何内容。它只是发生了。

但这并不会阻止你明确地这样做。

@synthesize list = somethingelse;

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

在大多数情况下NSMutableArray *thing = self.list 等价于NSMutableArray *thing = somethingelse

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

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

self.list = thinglist = thing

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

无论你使用什么风格,保持一致,并注意直接使用 ivar list = thing 与使用其访问器 self.list = thing 相比的效果

【讨论】:

好的,这更清楚了。在同一个对象内部是直接访问 ivar 的真正问题吗?我的意思是我认为在java中getter和setter用于访问类外部的变量,但在类内部直接调用变量。这里不一样吗?在 iOS 中,可变数组通常用于保存表格视图数据,而在我的代码中,我用来编写“list =”。那是“错误的”,我将使用 self.list 吗? 没有错,请注意,当您使用 "list = foo" 时,您不会调用 "[self setList:foo]" 。 ivars 默认情况下很强大,因此它可以在 ARC 下工作。 并且使用最近编译器自动生成的 _list 将确保使用访问器/突变器。对 ?所以现在使用@synthesize 的唯一原因是重新定义自定义访问器/突变器? 不,您仍然可以通过这种方式获得直接指针。在 var 前面加下划线并没有什么特别之处。它只是一种风格。使用访问器的唯一方法是调用“self.something”或其等效的 get/set 形式 setSomething:foo / -(id)something; 正如您所写的“在大多数情况下,NSMutableArray *thing = self.list 等同于 NSMutableArray *thing = somethingelse”我认为它正在使用访问器,但您的意思是通常对于列表它不是很不一样。所以我不明白,为什么苹果使用 _list ?如果它仍然是 ivar,那对我来说似乎没用。此外,如果它不使用 getter/setter,为什么苹果会为 ivar 使用下划线而不是简单的“列表”。这背后一定是有原因的。你有什么想法吗?【参考方案2】:

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

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

【讨论】:

以上是关于需要解释 iOS 中的 @property/@synthesize的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中的position+anchorPoint与frame应用解释

iOS Core Animation具体解释AutoLayout中的动画

node.js 中的标头 - 套接字 io 资源解释为脚本,但使用 MIME 类型 text/plain 传输:

界面生成器中的 iOS 多行标签

IOS5中的Safari不兼容Javascript中的Date问题

高性能IO模型浅析(彩图解释)good