大括号中的类变量与使用@property批注声明的类变量之间的差异

时间:2012-04-16 14:29:14

标签: objective-c

以下代码片段之间有什么区别?

否。 1

@interface HistoryJsonBean : NSObject
{
}

@property (nonatomic,retain) NSString * unit;

否。 2

@interface HistoryJsonBean : NSObject
{
    NSString * unit;
}

@property (nonatomic,retain) NSString * unit;

我是新手,上面两个代码之间真的有区别吗?

2 个答案:

答案 0 :(得分:3)

第二个有一个名为unit的实例变量,第一个没有。

请花点时间阅读Xcode组织者的“文档”选项卡下的“Objective-C编程语言”。

答案 1 :(得分:1)

第一种语法依赖于现代Objective C运行时系统的一个特性来从属性定义中创建相应的变量。因此,第二种语法只是与旧运行时系统一起使用的Objective C 2.0语法。

还要查看this post from S.O.

编辑:

后一种情况中的变量是ivar。

属性定义最初只是为其ivar定义访问器方法的短路(具有适当的内存管理)。较新的运行时系统放松了声明ivar的需要,你可以只使用属性定义(这也意味着分配内存来存储与属性相关的值)。

从接口的角度来看,在新的运行时系统上,您提到的两种语法之间没有区别。现在,如果运行时系统处理它们是两种不同的方式,这只能通过检查运行时系统源代码中的实现来说明。我猜这个级别也没有差别。