1: 在 对象内部 尽量 直接访问 实例变量

在对象之外访问实例变量时, 总是应该通过属性来访问, 然而在对象内部, 在读取实例变量的时候尽量采用 直接访问的形式, 而在设置实例变量的时候通过属性来做, 例子如下:

@interface EOCPerson : NSObject

@property (nonatomic, copy) NSString * firstName;

@prpperty (nonatomic, copy) NSString* lastName;

- (NSString*)fullName;

- (void)setFullName:(NSString*)fullName;

@end

fullName 和 setFullName 可以这样来实现

- (NSString*)fullName{

return [NSString stringWithFormat:@""%@ %@",self.firstName,self.lastName];

}

- (void)setFullName:(NSString *)fulleName{

NSArray * components = [fullName componentsSeparatedByString:@" "];

self.firstName = [components objectAtIndex:0];

self.lastname = [components objectAtIndex:1];

}

在上述 fullName 的获取方法 和 设置方法, 我们使用 '点语法', 通过存取方法来访问实例变量, 假设重写 这两个方法, 不经由存取方法, 而是直接访问实例变量.

- (NSString*)fullName{

return [NSString stringWithFormat:@""%@ %@",  _firstName,  _lastName];

}

- (void)setFullName:(NSString *)fulleName{

NSArray * components = [fullName componentsSeparatedByString:@" "];

_firstName = [components objectAtIndex:0];

_lastname = [components objectAtIndex:1];

}

// 这两种方法有几个区别

由于不经过 OC 的 '方法派发' , 步骤, 所以直接访问实例变量的速度是当然比较快的, 在这种情况下, 编译器所产生的代码会直接访问保存实例变量的那块内存

直接访问实例变量, 不会调用其 '设置方法', 这就绕过了为相关属性所定义的 '内存管理语义' (nontamic, strong , copy 等),

如果直接访问实例变量, 那么不会触发 '键值观察' (KVO) 通知,这样是否会产生问题, 取决于具体的对象行为

通过属性来访问有助于排查与之相关的错误, 因为可以给 getter 和 setter 方法新增 断点, 监控该属性的调用集齐访问时机

// 有一个折中的处理方案, 在写入实例变量的时候, 通过其 '设置方法' 来做, 而在读取实例变量的时候, 则直接访问,

此方法既能提高读取操作的速度, 又能控制对属性的写入 操作, 之所以要通过 '设置方法' 来写入实例变量, 其首要原因在于. 这样做能够确保相关属性的 '内存管理语义' 得意贯彻

但是,选用这种,需要注意几个问题

(1), 在初始化方法中应该如何设置属性值, 在各种情况下总是应该直接访问实例变量, 因为子类可能会 '覆写' 设置方法

(2) 另一个问题是 '惰性初始化', (即懒加载), 在这种情况下, 必须通过 getter 来访问属性, 否则实例变量就永远不会初始化, , 如果使用了 '懒加载', 就必须通过存取方法来访问属性

总结:

在对象内部读取数据时, 应该直接通过实例变量来读, 而写入数据时, 则应该通过 属性来写,

在初始化方法以及 dealloc 方法中, 总是应该直接通过实例变量来读写数据

在使用懒加载来初始化配置数据时, 需要通过属性来读取数据

iOS -- Effective Objective-C 阅读笔记 (4)的更多相关文章

  1. iOS Testing with Xcode 阅读笔记

    官方文档直通车 Performance Testing A baseline is a combination of the average time performance in ten runs ...

  2. Effective Java, 3e阅读笔记一

    引言 本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库,适用于任何具有实际Java工作经验的程序员. 本书一共90个条目,12章,每个条目讨论一条规则,这些规则反映了最有经验的优秀程序员 ...

  3. QCon 2015 阅读笔记 - 其他精选主题

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 QCon 2015 阅读笔记 - 其他精选主题 以前分享过两个主题:移动开发 ...

  4. QCon 2015 阅读笔记 - 移动开发最佳实践

    所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...

  5. SDL源码阅读笔记(1) 基本模块

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...

  6. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  7. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  8. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  9. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  10. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

随机推荐

  1. MySQL与MongoDB

    MySQL        MongoDB DB DB table Collections row  Documents column    Field 增 db.tables.insert({})#效 ...

  2. (PAT)L2-006 树的遍历 (二叉树构建)

    题目链接:https://www.patest.cn/contests/gplt/L2-006 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格 ...

  3. redis cli命令

    redis安装后,在src和/usr/local/bin下有几个以redis开头的可执行文件,称为redis shell,这些可执行文件可做很多事情. 可执行文件 作用 redis-server  启 ...

  4. 2019阿里P7最新总结Spring Boot面试问题

        Spring Boot一直是Spring生态系统的关键参与者.该项目通过其自动配置功能使我们的生活更加轻松.在本教程中,我们将介绍在求职面试中可能出现的一些与Spring Boot相关的最常见 ...

  5. Python——装饰器

    1.装饰器形成的过程 2.装饰器的作用 3.原则:开放封闭原则 开放:对扩展是开放的 封闭:对修改是封闭的 4.装饰器的固定模式 def func(): time.sleep(0.01) ') def ...

  6. 使用jenkins进行前端项目自动部署

    前面的话 后端的nodeJS项目可以使用pm2进行自动部署,由于前端项目打包后是静态资源,不需要进程守护.一般地,前端项目使用jenkins来进行自动部署,包括打包.测试等一系列流程.本文将详细介绍j ...

  7. Docker批量打标签,批量推送

    docker tag awmts- registry.gfstack.geo:/awmts- docker tag cts- registry.gfstack.geo:/cts- docker tag ...

  8. 关于opencv的cv2.WINDOW_一类

    用法:cv2.namedWindow('窗口标题',默认参数) 默认参数:cv2.WINDOW_AUTOSIZE+cv2.WINDOW_KEEPRATIO+cv2.WINDOW_GUI_EXPANDE ...

  9. Vue+koa2开发一款全栈小程序(9.图书详情页)

    1.获取图书详情 1.修改server/controllers/bookdetail.js为 const {mysql}=require('../qcloud') module.exports=asy ...

  10. 13-jQuery的ajax

    什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在网页 ...