需要在iOS中解释@property/@synthesis吗
我对iOS编程和Ojbective-C不太熟悉。我主要来自C(DSP、微控制器)、Delphi XE2/Pascal、Visual Basic和Java(桌面和Android应用程序)的背景 我主要是在Apress的《开始iOS 5开发》一书中学习Cocoa的 最近,我观看了2012年WWDC的视频,并浏览了他们的一些示例代码,我必须说,我不知道什么是编写我的应用程序的正确方法,更具体地说,是使用@property/@synthesis单词 在本书中,大多数(不是说全部)示例代码用于定义属性,例如需要在iOS中解释@property/@synthesis吗,ios,objective-c,properties,Ios,Objective C,Properties,我对iOS编程和Ojbective-C不太熟悉。我主要来自C(DSP、微控制器)、Delphi XE2/Pascal、Visual Basic和Java(桌面和Android应用程序)的背景 我主要是在Apress的《开始iOS 5开发》一书中学习Cocoa的 最近,我观看了2012年WWDC的视频,并浏览了他们的一些示例代码,我必须说,我不知道什么是编写我的应用程序的正确方法,更具体地说,是使用@property/@synthesis单词 在本书中,大多数(不是说全部)示例代码用于定义属性,例
ViewController.h
@property (strong, nonatomic) NSMutableArray *list;
ViewController.m
@synthesize list;
然后将所有代码访问列表与
self.list
或者干脆
list
现在,在我阅读的每一个WWDC代码示例中,我都看到程序员定义了一个属性,但在.m文件中,他们做了如下操作
@synthesize list = _list;
有时还需要访问
self.list
或
我很困惑。正确的做法是什么?由于苹果的程序员都使用下划线,我认为我应该这样做,但为什么这本书没有呢?列表和_列表之间有区别吗?还有更多,因为我在同一个对象中,为什么有时使用self.list,有时使用list/\u list
有时他们不使用@synthesis,我想是在他们想重新编写自己的访问器和变异器的时候(到目前为止,这还不是我的情况)
我在网上到处阅读,但没有什么足够清晰的东西可以让我的想法正确,所以我指望StackOverflow给这里带来光明
最后但并非最不重要的一点是,我更倾向于根据当前的iOS 6最佳实践/编程技术进行分析和回答。告诉我如何在较旧的iOS中正确操作是没有用的。这是一种语言功能,在过去几年中,它的使用发展很快,这就解释了各种形式。使用最新的工具,您可以选择忽略
@synthesis
,让事情合理运行
这种情况下的默认行为产生与
@synthesis list=\u list相同的效果代码>没有正确的方法。只有你喜欢的款式
最新的编译器对属性声明进行隐式综合
@synthesis list=\u list代码>
您的代码中从未写入任何内容。这只是碰巧
然而,这并不能明确地阻止你这么做
@synthesis list=somethingelse代码>
因此,当您通过访问器(self.list
)请求指向list
的指针时,您将获得指向somethingelse
在大多数情况下,NSMutableArray*thing=self.list
相当于NSMutableArray*thing=somethingelse
苹果使用一种风格并不意味着你必须这么做。每家公司通常都有自己的编码风格
使用@合成列表的主要问题代码>是因为它会带来风险,您可以编写
self.list=thing
或list=thing
前者使用sythesistedsetList:
访问器,而后者则不使用,并将相关错误的风险放在代码中,尽管这对于ARC
来说并不坏,因为strong
属性不会发生泄漏
无论您使用哪种风格,都要保持一致,并注意直接使用ivar与使用其访问器相比的效果。好的,这更清楚。在同一个对象内部,直接访问ivar的真正问题是什么?我的意思是,我认为在java中,getter和setter用于访问类外部的变量,但在类内部直接调用变量。这里不是一样吗?在iOS中,可变数组通常用于保存表视图数据,在我的代码中,我使用它来编写“list=”。这是“错误”吗?我将使用self.list?这没有错,只是要知道,当您使用“list=foo”时,您并没有调用“[self-setList:foo]”。IVAR在默认情况下是强大的,所以它在ARC下工作。使用最近的编译器自动生成的_列表将确保使用访问器/变异器。正确的?所以现在使用@synthesis的唯一原因是重新定义自定义访问器/变异器?不,你仍然可以通过这种方式获得直接指针。在变量前面加下划线没有什么特别的。它只是一种样式。使用访问器的唯一方法是调用“self.something”或其等价的get/set表单setSomething:foo/-(id)something;正如您所写的“在大多数情况下,NSMutableArray*thing=self.list相当于NSMutableArray*thing=somethingelse”,我以为它使用的是访问器,但您的意思是,通常对于列表,它没有太大的不同。所以我不明白,为什么苹果要使用_列表?如果它还是一个ivar,对我来说似乎没用。此外,如果它不使用getter/setter,为什么苹果会在ivar中使用下划线而不是简单的“list”。这背后一定有原因。你知道吗?
_list