【问题标题】:What is this @synthesize statment doing?这个@synthesize 语句在做什么?
【发布时间】:2011-09-16 10:20:28
【问题描述】:

给定以下类定义:

@interface MyController : OtherController {
    NSString *_ID;
}
@property(nonatomic,retain) NSString *ID;
@end

以及以下实现:

@implementation DRMControllerNDS
@synthesize ID =_ID;
@end

@synthesize 语句在这里做什么?具体来说,为什么我们将_ID 实例变量值设置为ID 属性? _ID 在执行时不会变成nil 吗?我已经看到这个结构被使用了很多次,但还没有理解它的用途......

谁能解释一下?

【问题讨论】:

  • 这是区分直接访问变量(_var)和通过综合访问器访问(self.var)的约定。
  • 类似问题:12345678、@987654329>99
  • @Sabobin:每个数字都是一个链接。
  • 哦,我的错误对不起各位。 :)

标签: objective-c cocoa properties


【解决方案1】:

用简单的英语,@synthesize 行说“为属性“ID”创建 getter 和 setter 方法,但不要使用名为“ID”的实例变量(默认值)来存储值,使用实例改为名为“_ID”的变量。”

【讨论】:

    【解决方案2】:

    如果您尝试访问instanceOfMyController._ID,则会收到错误消息,因为._ID 属性不存在; @synthesize 指令允许您使用点符号。

    请参阅this question 了解更多信息。

    【讨论】:

    • _ID 属性仍然不存在;没有宣布此类财产。属性是ID,这个@synthesize 指令告诉编译器使用_ID 实例变量来存储ID 属性。
    • 那么目标是允许您使用点表示法或使用实例变量名称,但出于某种原因将它们分开吗?目前还不清楚。换句话说,我可以写:instanceOfMyController.ID OR _ID 来访问变量吗?还是我仅限于其中一个?
    • 哦,刚刚想到了一些事情:使用 _ID 是一种绕过 getter 和 setter 的方法吗?也就是说,如果我使用 instanceOfMyController.ID,我使用的是 setter/getter,但如果我使用 _ID,我不是?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多