类接口中的ivar和声明属性(现代运行时)创建的ivar有什么区别吗?

时间:2011-04-14 03:48:46

标签: objective-c compiler-construction properties class-extensions

在现代运行时。 你可以声明属性,而不必在界面中声明ivar同名 像

@interface MyClass: NSObject
{
     NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end

我知道,这会自动为您生成一个str1 ivar,因为在实施过程中,您可以同时访问self.str1或纯str1

但我的问题是,str1和str2之间有什么区别吗?

如果它们是相同的,为什么类扩展(没有名称的类别)允许添加一个新的声明属性,该属性也会生成一个ivar但不允许在类扩展中添加一个ivar实例?(我知道LLVM 2.0)或者稍后允许这个,但gcc不会)

1 个答案:

答案 0 :(得分:0)

str1和str2是相同的,因为当你使用@property setter和getter方法时会自动生成,但如果之前没有存储值,则创建的是同名的实例变量。例如,在你的代码中,编译器会说,“看来我必须创建一个类NSString的实例,因为程序员想要访问它。”但是使用str2,已经创建了一个实例变量来存储数据,因此编译器无需创建数据。

就我个人而言,我的编码方式与str1相同,而不是在@interface中声明变量。

希望这有帮助。

另请查看:What's the purpose of an ivar when a property exists?