• 开发者通过对象来 存储并传递数据。
  • 在对象之间传递数据并执行任务的过程就叫做“消息传递”。

这两条特性的工作原理?

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 — 第二章 对象、消息、运行期 - 第六条:理解“属性”这一概念的更多相关文章

  1. iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期

    1. 属性 在开发过程中经常要用到定义属性,@property和@synthesize是经常用到的属性, property在.h文件中作声明,@synthesize在.m文件中用于实现 // Stud ...

  2. [Effective Java 读书笔记] 第三章类和接口 第十六条

    第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...

  3. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

  4. javascript进阶课程--第二章--对象

    javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...

  5. javascript进阶教程第二章对象案例实战

    javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...

  6. Java第二章----对象和类

    从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对 ...

  7. 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制

    Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...

  8. Object-C 1.0 第二章

    1.  输出obc #import <Foundation/Foundation.h> int main(int argc,const char *argv[]) { NSLog(@&qu ...

  9. python 第二章 对象与类型

    可变对象和不可变对象 1,可变对象,list(列表),dict(字典),集合(set),字节数组. 2,不可变对象,数值类型,字符串,字节串,元组(具体形式 ()). 注意条件:可变和不可变指的是该对 ...

随机推荐

  1. 数据库开发基础-SQl Server 基础

    SQL Server 基础 1.什么是SQL Server SQL:Structured Query Language  结构化查询语言 SQL Server是一个以客户/服务器(c/s)模式访问.使 ...

  2. 强制重启N种方法

    强制重启N种方法 2015-12-24 17:19 146人阅读 评论(0) 收藏 举报 本文章已收录于:   分类: 驱动开发学习(458) 作者同类文章X 1. 无意中看到一种通过控制92H端口b ...

  3. C# 图片超过指定大小将压缩到指定大小不失真

    using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...

  4. svn服务器无法访问时检查几个文件:

    出现该问题基本都是三个配置文件的问题,下面把这个文件列出来. svnserve.conf:[general]anon-access = readauth-access = writepassword- ...

  5. camerc文件播放

    下载CamtasiaStudio 5中文版,打开CamtasiaStudio.exe在左边有生成选项,点左边工具框内添加/导入媒体,则选择下面的批量生成.弹出添加文件的菜单点添加文件,加入你要转换的c ...

  6. FIneCMS /dayrui/libraries/Chart/ofc_upload_image.php Arbitrary File Upload Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link: http://www.wooyun.org ...

  7. Android登录界面实现

    花了一些时间实现了一个还算可以等登陆界面,主要是对这两天工作的一个总结:自定义按钮.编辑框.布局.全屏等. 效果如下: 获取代码:点这里

  8. A.Kaw矩阵代数初步学习笔记 1. Introduction

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  9. HDU 5904 LCIS (最长公共上升序列)

    传送门 Description Alex has two sequences a1,a2,...,an and b1,b2,...,bm. He wants find a longest common ...

  10. Alpha版本十天冲刺——Day 3

    站立式会议 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 Android端登录验证接口 子线程无法返回从服务器获取的信息. 注册接口.忘记密码接口 开发经验不足,有一个问题不知道怎么解决 ...