Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在iOS中解释@property/@synthesis吗_Ios_Objective C_Properties - Fatal编程技术网

需要在iOS中解释@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单词 在本书中,大多数(不是说全部)示例代码用于定义属性,例

我对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

前者使用sythesisted
setList:
访问器,而后者则不使用,并将相关错误的风险放在代码中,尽管这对于
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