【问题标题】:Is there any difference between the ivar in the class interface and the ones created by declared property(modern runtime)?类接口中的 ivar 与声明的属性(现代运行时)创建的 ivar 有什么区别?
【发布时间】:2011-04-14 03:48:46
【问题描述】:

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

【问题讨论】:

    标签: objective-c compiler-construction properties class-extensions


    【解决方案1】:

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

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

    希望这会有所帮助。

    也可以看看这个:What's the purpose of an ivar when a property exists?

    【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多