1

在现代运行时。您可以声明属性,而无需在接口中声明同名 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 没有)

4

1 回答 1

0

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

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

希望这可以帮助。

另请查看:当属性存在时,ivar 的目的是什么?

于 2012-06-04T01:48:54.217 回答