最近在了解Xcode 对 @property 所做的事情
我们都知道用@property 声明的属性 Xcode 会帮我们生成get set 方法,有时我们根据实际需要会重写get 或者set 方法.都是可以的.但是我们get set 方法都重写,就会报错

原因是: @property 已经帮我们重写了get set 方法 ,而现在我们又全部重写了get set 方法.导致Xcode 认为我们写的这 get set 方法的属性和@propery 声明的属性不是同一个属性了,所以会报错. 类似于 @property (nonatomic) NSString * name; 依然是Xcode 帮写get set 方法,但是 自己写的 get set 方法没有对应的属性声明.

如果非要重写get set 两个方法

如上图
加一个第 14 行代码的声明. 表示我们自己声明一个属性,但是没事get set方法 需要自己重写
这样一来第16行 代码可有可无.

  • 若 没有第16行 就类似c++ 一样了.无法突出oc 特性
  • 加了第16 行代码 就有真正OC语言的特性,一见到@property 就知道有get set 方法

当没有第16行代码,我们又重写了get 和set 方法,这个属性的get set 方法是我们自己实现

但是同时又有第16 行代码 ,Xcode 会处理发现 @property 和我们自己声明的东西是同一个属性,我们声明的get set 方法 会覆盖Xcode生成的get set 方法


这里面又涉及到两个属性@synthesize 和 @dynamic

引用一段话:

iOS 6 之后 LLVM 编译器引入property autosynthesis,即属性自动合成。换句话说,就是编译器会为每个 @property 添加 @synthesize ,如以下形式:
@synthesize propertyName = _propertyName;
这行代码会创造一个带下划线前缀的实例变量名,同时使用这个属性生成getter 和 setter 方法。
使用@synthesize 只有一个目的——给实例变量起个别名,或者说为同一个变量添加两个名字。
如果要阻止自动合成,记得使用 @dynamic 。经典的使用场景是你知道已经在某处实现了getter/setter 方法,而编译器不知道的情况。
此处我的理解是为了防止编译器使用自动合成生成新的setter/getter 会覆盖已经存在的旧的 setter/getter。
自动合成没有任何内存的含义,所以它根本没有连接到ARC。
如果你已经手动实现了 setter/getter方法,或着对 只读对象 实现了getter方法,那么自动合成不会产生任何影响。如果你在手动实现需要一个变量,只需声明它就可以了,不需要添加@synthesize来添加一个别名(尽管可以)。
还有一种情形需要使用 @synthesize ,就是当在 protocol 代理 中声明并实现属性时。协议中声明的属性不会自动生成setter和getter,

总结
1.@synthesize 的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成 setter/getter 方法。
2.禁止@synthesize:如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic 来阻止 @synthesize 自动生成新的 setter/getter
3.内存管理:@synthesize 和 ARC 无关。
4.使用:一般情况下无需对属性添加 @synthesize ,但一些特殊情形仍然需要,例如protocol中声明的属性。

上图中第14行代码 就是@synthesize 的作用 起到一个声明 下划线属性的作用 但是 getset 方法是我们自己实现的

这种情况下编译是没有错的,但是run 一下就会出错,
@dynamic name;
禁止生成 get set 方法了
如果我们把上图的注释放开,run 一下也是正常的.

@property (nonatomic) NSString * name;

等同于

{
NSString * _name;
}
-(void)setName:(NSString *)name {
_name = name;
}
-(NSString*)name {
return _name;
}

后者会覆盖前者的方法实现


有更好的理解或者理解的不对不全
欢迎交流: science168@126.com

OC get set 方法理解 get set方法不能同时重写相关推荐

  1. 垂直居中重要方法理解---重点是方法三

    方法一 这个方法把一些 div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align property 属性. <div id="wrapper"> ...

  2. OC视频笔记7(自定义初始化方法)8(类方法与实例方法的区别)(为什么NSString后面加*)

    笔记7接笔记6 另一种创建对象的方法,作为了解,不推荐使用 因为TestDemo *td = [[TestDemo alloc] init];可以看出该对象是分两步创建出来的,而且这样创建对象还可以直 ...

  3. iphone UIView的一些基本方法理解

    原文链接地址:http://www.cocoachina.com/bbs/read.php?tid=38766 UIView的一些基本方法理解 UIView的一些基本方法理解:loadView.vie ...

  4. 机器学习:一步步教你理解反向传播方法

    机器学习:一步步教你理解反向传播方法 时间 2016-09-13 00:35:59  Yong Yuan's blog 原文  http://yongyuan.name/blog/back-propa ...

  5. JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)

    为什么80%的码农都做不了架构师?>>>    理解$.extend(),与$.fn.extend()方法区别 1.$.extend()方法 $.extend()方法在JQuery中 ...

  6. 深入理解Objective-C:方法缓存

    摘要 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知.本文主要从 ...

  7. JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例

    栈.堆.方法区的交互关系 运行时数据区结构图 从线程共享与否的角度来看 栈,堆,方法区的交互关系 方法区的理解 方法区在哪里? <Java虚拟机规范>中明确说明:"尽管所有的方法 ...

  8. 全面解析python类的绑定方法与非绑定方法(转载+自己的消化与理解)

    参考链接来自: https://www.cnblogs.com/vipchenwei/p/7126772.html#_label1 先说下,这篇文章中,其实有这么个事情: 也就是,该文章有的函数后面没 ...

  9. 深入理解 Objective-C:方法缓存

    摘要 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知.本文主要从 ...

最新文章

  1. 正则表达式中的\.表示什么意思
  2. win7右键新建文件夹不见了
  3. 使用Crypto++库编译出错 解决办法
  4. python多线程下载编程_python多线程下载图片
  5. pyqt5能直接编译python吗_用PyInstaller打包用PyQt5编写的python程序
  6. SAP Fiori My note应用的add to功能的后台ABAP实现
  7. 三维数学基础(一)坐标系、向量、矩阵
  8. shell 获取当前日期时间
  9. 【数字信号调制】基于matlab GUI ASK+OOK+BPSK+8PSK+QPSK+AM调制解调【含Matlab源码 1368期】
  10. 阿拉伯数字转换大写例如:120转一百二十
  11. 如何在oracle导入dmp,如何在oracle中导入导出dmp文件
  12. JavaScript学习手册一:JS简介
  13. x-studio教程之 - 导入csb并发布到CocosStudio2.x兼容工程
  14. 公众号采集文章插件下载-支持各大网站自动采集发布的公众号插件
  15. Python Basic - write()方法
  16. 云计算之资源迁移技术
  17. 跟着团子学SAP PS:项目模版搭建 CJ91/CJ92/CJ93/CN01/CN02/CN03/CN11/CN12/CN13
  18. java采用降低图片分辨率大小来压缩图片大小
  19. AttributeError: module ‘keras_applications‘ has no attribute
  20. Server-U 访问外网服务器指定端口(内网21端口,外网其他端口)

热门文章

  1. 安卓 10 周岁了:这些消失的经典 APP 你还记得吗?
  2. 喜马拉雅转道港交所:上半年亏损3个亿,负债200亿元,现金流紧张
  3. python画时间序列图折线图_python画时间序列散点图
  4. 学习签名signature 的使用
  5. C语言程序设计精髓 第2周——数字间的那些事儿,做点计算哈 练兵区——编程题
  6. 集成流程安全报警功能迁移心得
  7. FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶......
  8. 新站如何用指数蛙快速提升百度权重的方法!
  9. EeePC各项硬件参数
  10. 小技巧助你解决div+css网页内容显示不完整