文档章节

谈iOS中 @synthesize 和 @dynamic 区别

q
 qqzhao2010
发布于 2015/11/07 14:18
字数 924
阅读 24
收藏 0
点赞 0
评论 0

前言

在iOS开发过程中,对类属性的定义有好几个关键字property,synthesize,dynamic。对于他们的用法,虽然大致清楚,但是还是有些不明白的地方,比如dynamic的使用。下面简单总结下我的理解。

property和synthesize

关键字 property 顾名思义,表示属性。其通常的用法是在头文件.h中声明类的属性。当然,如果这样,那么就表示这个属性是类的公开属性,外部可以进行访问。早期的代码中 property 要配合关键字 synthesize 使用。property 是声明,而 synthesize 相当于是实现了getter和setter方法。如下代码:

@interface TestEntity2 : NSObject

@property(nonatomic,strong)NSString *sss;
@property(nonatomic,strong)NSString *ttt;

@end

@implementation TestEntity2

@synthesize sss = sss_p;//相当于实现了下面2个函数
@synthesize ttt;//

- (void)setSss:(NSString *)sss{
    sss_p = sss;
}

- (NSString *)sss{
    return sss_p;
}

- (void)setTtt:(NSString *)ttt{
    _ttt = sss;
}

- (NSString *)ttt{
    return _ttt;
}

@end

后来苹果进一步对编译器进行了优化。基本上用不到关键字 synthesize ,默认系统会实现类似于上面ttt变量的getter和setter函数。这样编写类就更省事了。另外,再使用 property 关键字进行声明变量的时候,编译器支持设定变量的getter和setter方法,但是如果这样进行了设定,就必须配套 sythesize 进行声明,有点类似于内部别名。否则变量根本就无法使用。如下代码:

@property(nonatomic,strong,getter=fetchXXX,setter=resetXXX:)NSString *xxx;
//================================================================================================
@synthesize xxx = xxx_p;
- (NSString *)fetchXXX{
    return xxx_p;
}

- (void)resetXXX:(NSString *)xxx{
    xxx_p = xxx;
}

dynamic

关键字 dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。典型的用法是在CoreData中的NSManagedObject。如果在NSManagedObject子类中定义了属性,而implemention中没有使用 **dynamic 关键字。这时候会报下面的警告:

Property 'name' requires method 'name' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation

上面我自己定义的类中没有关键字,没有任何问题,但是现在却有一个警告说需要使用 synthesize 或者 dynamic 关键字,这其中必定有一些缘故。查找发现,问题的关键在于NSManagedObject,如下是其声明:

NS_CLASS_AVAILABLE(10_4,3_0) NS_REQUIRES_PROPERTY_DEFINITIONS
@interface NSManagedObject : NSObject {
@private
    int32_t             _cd_rc;
    uintptr_t           _cd_stateFlags;
    ...
}

问题就在于宏定义NS_REQUIRES_PROPERTY_DEFINITIONS,进一步查看

// Marks classes that must specify @dynamic or @synthesize for properties in their @implementation (property getters & setters will not be synthesized unless the @synthesize directive is used)
#if __has_attribute(objc_requires_property_definitions)
#define NS_REQUIRES_PROPERTY_DEFINITIONS __attribute__((objc_requires_property_definitions)) 
#else
#define NS_REQUIRES_PROPERTY_DEFINITIONS
#endif

上面的解释说的清清楚楚,宏的作用就是必须要指定属性的 dynamic 或者 dynamic ,否则就不行。这个是利用编译属性实现的。而在类实现中加入 dynamic 后,编译警告就消失了。另外,为了进一步印证我的想法,我把NS_REQUIRES_PROPERTY_DEFINITIONS,加到自己实现的类上面,发现和NSManagedObject子类一样,也会出现警告。

这也就是宏NS_REQUIRES_PROPERTY_DEFINITIONS和 dynamic 的用法所在吧。它的意思就是我在父类中已经把属性getter和setter方法实现了,不需要再在子类中实现了。那么如何实现呢?我们知道OC是一种动态语言,实现这点确实太容易了,文章中就是用动态绑定的方法实现的,有兴趣的可以看看。当然,它要是没有实现,我们也是不知道的,这时候只有在程序运行时发生crash才能发现。基于这种方式,调试Objective-C的消息传递机制时也会方便一些,另见文章。

© 著作权归作者所有

共有 人打赏支持
q
粉丝 0
博文 150
码字总数 42625
作品 0
海淀
程序员
ios6 LLVM 4.0 obj-c 语法的一些变化

ios 6 采用了新的编译器LLVM 4.0, 其中带来了一些objc语法方便的小改变。 在生成string 时, 我们在objc 常使用NSString *s = @"string"; 使得创建string十分方便。在ios 6我们可以使用类似...

董桉远
2013/03/20
0
5
经过阿里,百度一面,二面后,我总结了50道iOS面试题

前言: 金三银四已经过去,根据统计,很多人都会选择在三月四月跳槽,原因有很多,企业年后会有大量员工离职,员工觉得老公司待遇不怎么样?薪资不够高,想换个新环境等等原因,所以,三月四...

原来是泽镜啊
05/04
0
0
iOS朋友圈,视频播放器、钓鱼小游戏、玻璃动画源码

iOS精选源码 模仿抖音App的ye m切换框架 将所有类型的推送封装成API,提供OC和Swift双版本调用demo2.0 波浪动画 【Swift/Objective-C】强劲的日期选择控件 利用Masonry 和YYlable ,FDTempla...

sunnyaigd
2017/11/06
0
0
那些在学习iOS开发前就应该知道的事(part 1)

英文原文:Things I wish I had known before starting iOS development—Part 1 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了。这个界面模...

TomatosX
2015/06/12
0
0
2018 一份"有点难"的iOS面试题(5年iOS开发)

序言: 之前一时兴致在本站上出过一份iOS的中级面试题,引起一些关注,不少同学表示对”隐藏关卡“感兴趣。升级版iOS面试题来了,目测难倒90%iOS程序员,目测一大波程序员撸着袖子在靠近。 ...

原来是泽镜啊
05/26
0
0
iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普

iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普 发布于 2018-04-13 文章被以下专栏收录

少数派
07/06
0
0
iOS 11开发教程(四)iOS11模拟器介绍一

iOS11模拟器介绍 在图1.6或者1.7中所看到的类似于手机的模型就是iOS模拟器。iOS模拟器是在没有iPhone或iPad设备时,对程序进行检测的设备。iOS模拟器可以模仿真实的iPhone或iPad等设备的一些...

大学霸
2017/10/24
0
0
iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码

iOS精选源码 微信自定义搜索框实现(http://www.code4app.com/thread-13182-1-1.html) 一个商城Demo,持续更新中(http://www.code4app.com/thread-13957-1-1.html) 在Object-C中学习数据结构与...

sunnyaigd
07/03
0
0
iOS 方法中 单指针和双指针的区别

iOS 双指针 iOS 单指针,双指针在方法参数中的区别 传入单指针,在方法内会复制一个临时的指针副本,在方法内操作的都是这个临时副本 传入双指针,在方法内会改变方法外 指针的指向 iOS 双指...

iOS_愛OS
前天
0
0
iOS开发,#define的使用(系列一)

1、判断当前设备是不是iOS7以上版本 #define IOSVERSION7ORABOVE (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)? (YES):(NO)) 如果判断系统的设备在项目中使用频繁,那么...

召唤攻城狮
2014/04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
21分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
32分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
38分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
52分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
59分钟前
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0
转行零基础该如何学Python?这些一定要明白!

转行零基础学Python编程开发难度大吗?从哪学起?近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大?今天,小编就来为大家详细解读一下这个问题。...

猫咪编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部