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. jmeter学习记录--03--jmeter负载与监听

    jmeter场景主要通过线程组设置完成,有些复杂场景需要与逻辑控制器配合. 一.测试计划设计与执行 场景设计 jmete线程组实际是一个线程池,根据用户设置进行线程池的初始优化,在运行时做各种异常的处 ...

  2. [转帖]Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    Linux操作系统中,*.zip.*.tar.*.tar.gz.*.tar.bz2.*.tar.xz.*.jar.*.7z等格式的压缩与解压 https://blog.csdn.net/gatieme ...

  3. Flutter之List

    void listDemo() { // 1.list的创建 listCreate(); // 2.多种类型的输出 listPrint(); // 3.添加数据 listAddElement(); / ...

  4. vhdl when else

    在VHDL中,IF...THEN...ELSE是顺序语句,只能出现在行为描述中(进程体或者子程序中):而WHEN...ELSE是并行语句,可以直接出现在结构体中,但却不能出现在行为描述中.WHEN.. ...

  5. wrk编译报错gcc: Command not found

    报错信息如下: 问题原因:没有安装gcc 解决办法: yum -y install gcc+ gcc-c++ 若需升级gcc,则采用如下命令: yum -y update gcc

  6. 第六十五天 js操作

    1.闭包 // 函数的嵌套定义,定义在内部的函数都称之为 闭包 // 1.一个函数要使用另一个函数的局部变量 // 2.闭包会持久化包裹自身的函数的局部变量 // 3.解决循环绑定 function ...

  7. phpStudy The requested URL /web/index.php was not found on this server

    1.原因 phpStudy的httpd-conf 与 vhosts-ini 的目录设置错了 2.解决 分别打开httpd-conf 与 vhosts-ini 2个文件,搜索WWW,把里面的路径改成你的 ...

  8. pgsql事务与并发控制

    事务与并发控制 事务的基本的概念和性质 ACID: 原子性:一个事务要么全部执行,要么全部不执行 一致性:执行事务的时候,数据库从一个一致的状态变更到另一个状态 隔离性: 确保在并发执行的时候,每个事 ...

  9. Luogu P2057 [SHOI2007]善意的投票

    题目链接 \(Click\) \(Here\) 考虑模型转换.变成文理分科二选一带收益模型,就一波带走了. 如果没有见过这个模型的话,这里讲的很详细. #include <bits/stdc++ ...

  10. A Graph Partitioning Game Theoretical Approach for the VNF Service Chaining Problem

    文章名称:A Graph Partitioning Game Theoretical Approach for the VNF Service Chaining Problem 发表时间:2017 期 ...