Objective c 类接口中的ivar与由声明的属性(现代运行时)创建的ivar之间有什么区别吗?
在现代运行时。 您可以声明属性,而不必在接口中声明同名ivar 像 我知道,这将自动为您生成str1 ivar,因为在实现中,您可以访问self.str1或纯str1 但我的问题是,str1和str2之间有什么区别吗Objective c 类接口中的ivar与由声明的属性(现代运行时)创建的ivar之间有什么区别吗?,objective-c,compiler-construction,properties,class-extensions,Objective C,Compiler Construction,Properties,Class Extensions,在现代运行时。 您可以声明属性,而不必在接口中声明同名ivar 像 我知道,这将自动为您生成str1 ivar,因为在实现中,您可以访问self.str1或纯str1 但我的问题是,str1和str2之间有什么区别吗 如果它们是一样的,为什么没有名称的类别扩展允许添加一个新的声明属性,该属性也将生成ivar,但不允许在类别扩展中添加ivar实例?我知道LLVM 2.0或更高版本允许这样做,但gcc不允许这样做,因为当您使用@property setter和getter方法时,str1和str2是
如果它们是一样的,为什么没有名称的类别扩展允许添加一个新的声明属性,该属性也将生成ivar,但不允许在类别扩展中添加ivar实例?我知道LLVM 2.0或更高版本允许这样做,但gcc不允许这样做,因为当您使用@property setter和getter方法时,str1和str2是相同的如果以前没有用于存储值的实例变量,则生成但也创建了一个同名的实例变量。例如,在您的代码中,编译器会说,似乎我必须创建NSString类的实例,因为程序员想要访问它。但是对于str2,已经创建了一个实例变量来存储数据,因此编译器不需要创建一个实例变量 就个人而言,我编写的代码与str1类似,没有在@interface中声明变量 希望这有帮助
还要检查以下内容:创建变量的不是property指令,而是@synthesis:
@interface MyClass: NSObject
{
NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end