【问题标题】:Variables in both the interface and as a property using Objective-C接口中的变量和使用 Objective-C 的属性
【发布时间】:2011-06-01 03:29:05
【问题描述】:

有什么区别

@interface URLCacheConnection : NSObject {
    id <URLCacheConnectionDelegate> delegate;
}

@property (nonatomic, assign) id delegate;
@end

@interface URLCacheConnection : NSObject {

}

@property (nonatomic, assign) id<URLCacheConnectionDelegate> delegate;
@end

这两个类定义似乎都表现相同。在接口和属性中定义变量的目的是什么?

【问题讨论】:

    标签: objective-c ios4


    【解决方案1】:

    和...有什么区别

    主要区别在于,在第一种情况下,您将能够在调试器中看到 delegate ivar,而在第二种情况下则看不到。

    定义的目的是什么 接口和 as 中的变量 财产?

    这部分是向后兼容性的问题。合成实例变量的能力是 Objective-C 的一个相对较新的特性。此外,可能总是希望能够创建供内部使用且没有相应属性的实例变量。

    【讨论】:

      【解决方案2】:

      首先,两者并不完全相同。首先,编译器将允许您将任何对象分配为委托,而对于第二个,如果您分配的对象不符合 URLCacheConnectionDelegate 协议,它会报错。当然,这很容易解决。

      在 Apple 的 Objective-C 编译器的早期版本中,需要显式声明支持属性的 ivar 才能使用 @synthesize。在某些时候(我忘了确切的时间),他们更改了它以允许编译器/运行时自动创建所需的 ivar。

      【讨论】:

      • 如果编译器在前一种情况下没有对@synthesize delegate; 发出警告,请提交一个错误(这至少应该是一个分析器警告)。
      • 啊,我错过了协议的那一点。
      【解决方案3】:

      区别在于实现。使用第一个,您可以@synthesize getter 和 setter,并可以访问声明的内部变量。

      使用第二个,您将不得不使用 @dynamic 并编写 getter 和 setter 代码,因为没有 XCode 可以为其生成代码的内部变量。

      这是我的阅读 - 很高兴知道它是否错了。

      是的 - 错误:-(

      【讨论】:

      • 目前的编译器实际上可以为你生成实例变量。
      • 庆幸,因为这是不正确的。对于没有显式声明的 ivar 的属性,您可以 @synthesize getter 和 setter。在这种情况下,编译器会自动为你创建 ivars。
      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2012-12-23
      • 2015-05-06
      • 2012-02-02
      • 2010-10-25
      • 2011-11-10
      • 2014-03-06
      • 2013-05-19
      相关资源
      最近更新 更多