Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.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
Iphone 在Xcode 4中定义成员和属性&;iOS 4_Iphone_Xcode_Ios_Ios4 - Fatal编程技术网

Iphone 在Xcode 4中定义成员和属性&;iOS 4

Iphone 在Xcode 4中定义成员和属性&;iOS 4,iphone,xcode,ios,ios4,Iphone,Xcode,Ios,Ios4,我正在开发一个相当雄心勃勃的第一个iPhone项目,我不知道该以何种方式实现和访问属性以及为什么 例1: (在.h中) (在.m中) 例2: (在.h中) (在.m中) 这两种方法对我来说似乎都很管用,但我正试图弄清楚为什么有两种方法可以做到这一点,以及这两种方法都有什么好处 有人能告诉我区别吗?示例1演示了定义ivar/属性变量对的旧方法。新编译器现在为您生成IVAR(NSstring*_sale;部分)。示例1还演示了使用@synthetic sale=\u sale手动将属性sale与iv

我正在开发一个相当雄心勃勃的第一个iPhone项目,我不知道该以何种方式实现和访问属性以及为什么

例1: (在.h中)

(在.m中)

例2: (在.h中)

(在.m中)

这两种方法对我来说似乎都很管用,但我正试图弄清楚为什么有两种方法可以做到这一点,以及这两种方法都有什么好处


有人能告诉我区别吗?

示例1演示了定义ivar/属性变量对的旧方法。新编译器现在为您生成IVAR(NSstring*_sale;部分)。示例1还演示了使用
@synthetic sale=\u sale手动将属性
sale
与ivar
\u sale
配对语句

示例2是在Obj-C中实现属性的更简洁的方法,也是您在internet上看到大多数示例代码的方式。大多数情况下,您可以编写属性,而无需覆盖编译器为您生成的访问器/变异器方法

为了清晰起见,有些死硬的支持者使用下划线前缀来表示实例变量。您可能会发现,这对内存管理很有帮助,如示例1所示,将
self.sale
设置为等于自动删除的NSString就可以了,因为它会被保留,但是将
\u sale
设置为等于自动删除的对象将导致以后的行为不稳定,因为实例变量不会保留传入的NSString

一般来说,我更喜欢编写我的属性,如您在示例2中所示


简短回答:有两种方法可以做到这一点,因为新的编译器现在可以为您推断一些东西,但以前的方法已经保留下来,以便向后兼容。

它们的工作方式相同。有些人在实例变量前面加下划线,作为区分成员变量和实例变量的视觉提示

关于这个问题的更多讨论:


有关更多可可风格指南,请查看。

视情况而定。。如果您不想通过setter和getter访问ivar(并通过使用_名称显式显示),您可以按照示例1进行操作,但通常按照示例2进行操作。@sk先生:XCode 4直到2010年才发布,2009年才发布相关代码。非常感谢,特别是从内存管理的角度来看。我来自PHP、Java和C#;记忆管理是一门有趣而又陌生的科学
Nsstring *_sale;
@property (nonatomic, retain) NSString *sale;
@synthesize sale = _sale;
@property (nonatomic, retain) NSString *sale;
@synthesize sale;