Effective Objective-C 2.0 — 第二章 对象、消息、运行期 - 第六条:理解“属性”这一概念
- 开发者通过对象来 存储并传递数据。
- 在对象之间传递数据并执行任务的过程就叫做“消息传递”。
这两条特性的工作原理?
Objective-C运行期环境(Objective-C runtime) ,提供了使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑。
第六条:理解“属性”这一概念
@interface EOCPerson : NSObject {
@public
//NSString *_dateOfBrith;
NSString *_firstName;
NSString *_lastName;
@private
NSString *_aomeInternalData;
}
@end
这种写法问题,对象布局在 编译器(compile time)就已经固定了。只要碰到访问——firstName变量的代码,编译器就把其替换为“偏移量”(offset),这个偏移量是“硬编码”(hardcode),表示带变量距离存放对象的内存区域的起始地址有多远。
但是又加了一个实例变量就会出错,原来表示_firstName的偏移量现在却指向 _dateOfBirth了。
Objective-C的应对做法是,把实例变量当作一种存储偏移量所用的“特殊变量”,交由“类对象(class object)保管。偏移量会在运行期查找,如果类的定义变了,那么存储的偏移量也就变了。这样甚至可以在运行期向类中新增实例变了,这就是稳固的”应用程序二进制接口“ABI。有了ABI,就可以在class-continuation分类或 实现文件中定义实例变量了
另一种解决办法:
1,通过@property语法来定义对象中所封装的数据
属性优势:如果使用了属性,编译器就会自动编写访问这些属性所的方法,此过程叫做”自动合成“(autosynthesis),此过程在编译器执行
@dynamic :告诉编译器:不要自动创建实现属性所用的实例变了,也不要为其创建存取方法。
属性特质 :
原子性
(atomicity) ,系统其他部分无法观察到其中间步骤所生成的临时结果,而只能看到操作前与操作后的结果,该操作就是(atomic)
读写权限
内存管理语义
(concrete ownership semantic) 具体的所有权语义
assign :”设置方法“只会执行针对”纯量类型“(scalar type, 例如CGFloat 或 NSInteger等)的简单赋值操作。
strong :表明该属性定义了一种”拥有关系“(owning relationship)为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
weak:表明该属性定义了一种”非拥有关系“(nonowning relationship)为这种属性设置新值时,设置方法会既不保留新值,也不释放旧值,与assign相似,再属性所致的对象遭到摧毁时,属性值也会清空(nil out)
unsafe_unretained : 此特质的语义和assign系那个痛,但它适用于”对象类型“(object type),该特质表达一种”非拥有关系"("不保留",unretained), 当目标对象遭到摧毁时,属性值不会自动清空(“不安全”,unsafe),这一点与weak有区别。
copy:与strong类似。但是设置方法并不保留新值,而是“拷贝”。当属性为NSString 时经常用来保护其封装性,因为有可能传递给设置方法的新值指向一个NSMutableString类的实例,可以修改其值的字符串,若不用copy那么设置完属性后,可能在对象不知情的情况下遭人更改
方法名:
getter=<name> 指定获取方法的方法名。如果属性是Boolean型,而你想加前缀“is",就可以用这个方法来指定。
如表示”开关“(switch)是否打开的属性就是 这样定义的:
@property (nonatomic, getter=isOn) BOOL on;
atomic 与 nonatomic 的区别是:
具备atomic特质的获取方法会通过锁定机制来确保其操作的原子性。也就是说如果两个线程读写同一属性,那么不论何时总能看到有效的属性值。若使用nonatomic 即不加锁,当一个线程正在改写某属性值时,另一个线程会突然闯入,把尚未修改好的属性值读取出来,读到的属性值可能不对。
使用同步锁的开销较大,性能不好。一般使用nonatomic属性。
Effective Objective-C 2.0 — 第二章 对象、消息、运行期 - 第六条:理解“属性”这一概念的更多相关文章
- iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期
1. 属性 在开发过程中经常要用到定义属性,@property和@synthesize是经常用到的属性, property在.h文件中作声明,@synthesize在.m文件中用于实现 // Stud ...
- [Effective Java 读书笔记] 第三章类和接口 第十六条
第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- javascript进阶课程--第二章--对象
javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...
- javascript进阶教程第二章对象案例实战
javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...
- Java第二章----对象和类
从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制
Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...
- Object-C 1.0 第二章
1. 输出obc #import <Foundation/Foundation.h> int main(int argc,const char *argv[]) { NSLog(@&qu ...
- python 第二章 对象与类型
可变对象和不可变对象 1,可变对象,list(列表),dict(字典),集合(set),字节数组. 2,不可变对象,数值类型,字符串,字节串,元组(具体形式 ()). 注意条件:可变和不可变指的是该对 ...
随机推荐
- C#-WinForm-Timer控件
比如在窗体中显示时间: 错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间 public Form6() { InitializeComponent(); while (true) ...
- iOS蓝牙开发(一)蓝牙相关基础知识(转)
转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...
- iOS中通知中心(NSNotificationCenter)的使用总结
一.了解几个相关的类 1.NSNotification 这个类可以理解为一个消息对象,其中有三个成员变量. 这个成员变量是这个消息对象的唯一标识,用于辨别消息对象. @property (readon ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
- js-JavaScript高级程序设计学习笔记10
第十四章 表单脚本 1.通过getElementBy**可以获得<form>元素,或者通过document.forms可以取得页面中所有的表单,可以通过数值索引或者name值取得特定的表单 ...
- exists的用法
今天突然看到之前自己写的一个代码 久久没想通为毛.. 看来笔记还是需要 exists可以代替子查询in 比in 更高效 默认是exists 查询中包含有数据则条件成立..否则没数据 select ...
- 使用IDEA进行远程调试
虽然很早以前就只有Eclipse和IDEA都支持远程调试功能的,但是基本没怎么使用过,今天因为紧急处理一个问题,而本地环境搭建起来比较麻烦,所以就使用了IDEA的远程调试功能.因此写一篇文章记录一下. ...
- AngularJs $location 和 $window
$location $location服务解析浏览器地址中的url(基于window.location)并且使url在应用程序中可用.将地址栏中的网址的变化反映到$location服务和$locati ...
- 解决冲突-git入门教程
人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...
- NOIp DP 1003 爆零记
6道DP题只拿了220分,NOIp我不滚粗谁滚粗? 考试历程貌似并没有什么可说的QAQ,就是不停的来回推方程和写崩的状态中. 正经题解 六道题其实除了第六道比较恶心..其他的都还算可以. truck ...