iOS -- Effective Objective-C 阅读笔记 (4)
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)的更多相关文章
- iOS Testing with Xcode 阅读笔记
官方文档直通车 Performance Testing A baseline is a combination of the average time performance in ten runs ...
- Effective Java, 3e阅读笔记一
引言 本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库,适用于任何具有实际Java工作经验的程序员. 本书一共90个条目,12章,每个条目讨论一条规则,这些规则反映了最有经验的优秀程序员 ...
- QCon 2015 阅读笔记 - 其他精选主题
QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 QCon 2015 阅读笔记 - 其他精选主题 以前分享过两个主题:移动开发 ...
- QCon 2015 阅读笔记 - 移动开发最佳实践
所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...
- SDL源码阅读笔记(1) 基本模块
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
随机推荐
- Sql Server登录失败问题
1.启动SQL Server 2008 Management Studio,会看到 2. 里面有一个 身份验证.这个 身份验证 的下拉列表里面有两个选项: Windows 身份验证 和 SQL Ser ...
- 家庭记账本小程序之框架设计(java web基础版一)
1.设计主页 main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...
- 【翻译】asp.net core中使用MediatR
这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作 ...
- 数据标记系列——标记工具Imagtagger
https://github.com/bit-bots/imagetagger 待有空说一说!
- [洛谷P2107] 小Z的AK计划
题目类型:贪心,堆 传送门:>Here< 题意:给出\(N\)个房间,每个房间距离起点的距离为\(x[i]\),每个房间可以选择进去和不进去,如果进去了那么要\(t[i]\)秒后才能出来. ...
- Django练习——图书管理系统
Django图书管理系统 创建一个项目 1. django-admin startproject 图书管理 2. cmd 命令终端下创建一个app python manage.py startapp ...
- python学习 day13 装饰器(一)&推导式
装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...
- sqlalchemy和pymysql通过ssh连接远程mysql服务器
首先需要一个模块sshtunnel,如果没有直接pip install sshtunnel 其实连个连接方式非常像: pymysql连接方式: import pymysql from sshtunne ...
- MQ在高并发环境下,如果队列满了,如何防止消息丢失?
1.为什么MQ能解决高并发环境下的消息堆积问题? MQ消息如果堆积,消费者不会立马消费所有的消息,不具有实时性,所以可以解决高并发的问题. 性能比较好的消息中间件:Kafka.RabbitMQ,Roc ...
- jQuery使用(十一):jQuery实例遍历与索引
each() children() index() 一.jQuery实例遍历方法each() jQuery实例上的each()方法规定要运行的函数,并且给函数传入两个参数:index,element. ...