博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你对@synthesize混淆了吗?
阅读量:6367 次
发布时间:2019-06-23

本文共 1736 字,大约阅读时间需要 5 分钟。

简单谈谈 @synthesize

@synthesize 是编译器自动生成 setter/getter 方法的实现(实现实现实现很重要)的关键词。当前开发中使用了 @property 后,会在 .m 中自动生成 @synthesize 属性名 = _属性名,而不是 @property 本身帮我们生成 setter/getter 方法,@property 本身只是生成 setter/getter 方法的声明(声明声明声明很重要)。

@synthesize 写出来的代码可能会长这样:

  1. @synthesize boy;

  2. @synthesize boy = boy;

  3. @synthesize boy = _boy;

  4. (girl是事先声明好的一个变量)

@implementation ViewController {     NSObject *girl; } @synthesize boy = girl;复制代码
  1. @synthesize boy = noDeclaredVar;(noDeclaredVar是指没有声明过,随便打出来的)

上述5个代码都是能够正常使用的。看着有点绕,新手可能看不懂这到底是干嘛的。

简单解释下,@synthesize boy 默认等于 @synthesize boy = boy;。那么只要理解一种:@synthesize xx = yy; 即可。这个“等式”表明“之前用@property (nonatomic, strong) NSObject *boy; 声明的这个“属性”在 setter/getter 方法中实际使用的实例变量是 yy,如果 yy 没有手动声明,那么会自动声明为一个实例变量。

补充一点:xx 必须是用 @property 声明过的。

我们对照着上面的5个关键字代码看看。

  1. @property 声明的boy,在 setter/getter 方法中使用 NSObject *boy; 这个实例变量来赋值与返回。
  2. 同1。
  3. @property 声明的boy,在 setter/getter 方法中使用 NSObject * _boy; 这个实例变量来赋值与返回。
  4. @property 声明的boy,在 setter/getter 方法中使用 NSObject *girl; 这个实例变量来赋值与返回。
  5. @property 声明的boy,在 setter/getter 方法中使用 NSObject * noDeclaredVar; 这个实例变量来赋值与返回。

@synthesize 使用指定的属性实践

@interface ViewController ()@property (nonatomic, copy) NSObject *boy;@end@implementation ViewController {	NSObject *boy;	NSObject *girl;}@synthesize boy = girl;- (void)viewDidLoad {	[super viewDidLoad];	self.boy = [[NSObject alloc] init];	NSLog(@"请问那个孩子已经出生了?boy : %@  girl : %@",boy, girl);}@end复制代码
  1. @implementation 中声明的成员属性 NSObject *boy@property 声明的boy是否是同一个对象?还存不存在 _boy 这个实例变量?

    不是,@synthesize已经指定了 girl 作为 setter/getter 方法里使用的实例变量,不再自动生成 _boy 这个实例变量了。

  2. @synthesize boy = girl; 到底是把 boy 变成了 girl ,还是把 girl 变成了boy?

    没有变来变去,因为压根不存在 _boy 了。是把 boy 的 setter 方法 - (void)setBoy:(NSObject *)boy 的实现改成了 girl = boy ,即把 _boygirl 替代。已经不存在 _boy 这个成员变量了。

转载地址:http://ccrma.baihongyu.com/

你可能感兴趣的文章
Heartbeat+DRBD+MFS高可用
查看>>
要感谢那些曾经慢待你的人
查看>>
常见的global cache等待事件
查看>>
第 7 章 多主机管理 - 047 - 管理 Machine
查看>>
CentOS5和6的系统启动流程
查看>>
怎么看域客户端是否继承了组策略
查看>>
linux防止DDoS***
查看>>
6.4 Linked List 重做
查看>>
小米路由
查看>>
QT 学习 之 窗口拖拽 实现
查看>>
PHP的ftp文件,多文件上传操作类
查看>>
js中清空数组的方法
查看>>
python def说明
查看>>
Java根据IP获取国家省级地市信息
查看>>
自动安装系统及网络安装服务
查看>>
11g RAC 更改归档模式 ,归档文件存放在ASM 磁盘组
查看>>
Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
查看>>
【转载】VBA:调用文件夹对话框的几种方法
查看>>
centos rm命令恢复删除的文件
查看>>
eclipse修改源码导出jar包
查看>>