这个@synthesize 语句在做啥?

Posted

技术标签:

【中文标题】这个@synthesize 语句在做啥?【英文标题】: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)的约定。 类似问题:1、2、3、4、5、6、7、8、@987654329>99 @Sabobin:每个数字都是一个链接。 哦,我的错误对不起各位。 :) 【参考方案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,我不是?

以上是关于这个@synthesize 语句在做啥?的主要内容,如果未能解决你的问题,请参考以下文章

语句的右侧在做啥?

如何控制 MIDI 通道的音量

这个函数在做啥

这个 struct node **p 在做啥?

调试这个 LISP 病毒在做啥

这个 C++ 强制转换代码在做啥?