问题描述
|
在现代运行时中。
您可以声明属性而无需在接口中声明相同名称的ivar
喜欢
@interface MyClass: NSObject
{
Nsstring *str2;
}
@property (retain) Nsstring *str1;
@property (retain) Nsstring *str2;
@end
我知道,这将为您自动生成str1 ivar,因为在实现中,您可以访问access1ѭ或仅访问str1
。
但是我的问题是,str1和str2之间有什么区别吗?
如果相同,为什么类扩展(没有名称的类别)允许添加新的声明属性,该属性也会生成一个ivar,但不允许在类扩展中添加ivar实例?(我知道LLVM 2.0或更高版本允许这个,但gcc不会)
解决方法
str1和str2相同,这是因为使用@property时会自动生成setter和getter方法,但如果以前没有用于存储值的实例变量,则还会创建一个同名实例变量。例如,在您的代码中,编译器将说:“看来我必须创建类NSString的实例,因为程序员希望访问它。”但是对于str2,已经创建了一个实例变量来存储数据,因此编译器无需创建一个。
就个人而言,我的代码就像您对str1所做的一样,没有在@interface中声明变量。
希望这可以帮助。
还要检查一下:属性存在时ivar的目的是什么?