Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c 类接口中的ivar与由声明的属性(现代运行时)创建的ivar之间有什么区别吗?_Objective C_Compiler Construction_Properties_Class Extensions - Fatal编程技术网

Objective c 类接口中的ivar与由声明的属性(现代运行时)创建的ivar之间有什么区别吗?

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 像

我知道,这将自动为您生成str1 ivar,因为在实现中,您可以访问self.str1或纯str1

但我的问题是,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