objective C语言 类接口中的ivar和由声明的属性创建的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不允许)

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

就我个人而言,我的代码就像你对str1所做的那样,而不是在@interface中声明变量。

希望对你有帮助。

还可以看看这个:当属性存在时,ivar的目的是什么?

最新更新