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

问题描述

| 在现代运行时中。 您可以声明属性而无需在接口中声明相同名称的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的目的是什么?     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...