文档章节

IOS OC 对象内部尽量直接访问实例变量

卧龙小
 卧龙小
发布于 2015/07/01 15:51
字数 561
阅读 243
收藏 1

在对象之外访问实例变量时,应该通过属性来做,然而在对象内部访问实例变量,强烈建议读取实例变量的时候通过直接访问的形式,而在设置实例变量的时候通过属性来做。


一 self.property 和_property 区别

  • 直接访问实例变量,不经过OC 的 "方法派发" (下篇写),访问速度快,编译器生成的代码会直接访问保存对象实例变量的内存


  • 直接访问实例变量,不会调用 设置方法,绕过了相关属性所定义的“内存管理语义”,例如在ARC 中,直接方法copy的属性,不会拷贝而是直接覆盖


  • 直接访问实例变量,不会触发KVO


  • 通过属性访问,可以设置断点调试


综合上面的情况:在写入实例变量时,通过 设置方法 来做,而在读取的时候 ,通过直接访问的方式。既可以提高读取操作速读,又能控制对属性的写入,保证相关属性的 "内存管理语义" 得以贯彻。


二 注意点

2.1 懒加载

懒加载的情况下,必须通过 获取方法 来访问属性,或者,实例变量不会别初始化

-(NSArray *)array{
    if (!_array) {
        _array = @[@"aa",@"bb"];
    }
    return _array;
}


2.2 不要在 init 和 dealloc 方法中使用 self.property

== init
-(id)init {
     self = [super init];
     if (self) {
          _count = [[NSNumber alloc] initWithInteger:0];
     }
     return self;
}

== dealloc
- (void)dealloc {
     [_count release];
     [super dealloc];
}

在 init 和 dealloc 中,对象的存在与否还不确定,所以给对象发消息可能不会成功。请详细查看 巧哥这篇 不要在init和dealloc函数中使用accessor



三 总结

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

在初始化方法和 dealloc 方法中,应该直接通实例变量名直接来读写数据,避免用self.property访问

使用懒加载时,需要通过属性来读取数据


© 著作权归作者所有

共有 人打赏支持
上一篇: 人的极限
下一篇: IOS OC 字面量语法
卧龙小
粉丝 42
博文 146
码字总数 70107
作品 0
西城
程序员
私信 提问
iOS 编写高质量Objective-C代码(二)

《编写高质量OC代码》已经顺利完成一二三四篇! 附上链接: iOS 编写高质量Objective-C代码(一) iOS 编写高质量Objective-C代码(二) iOS 编写高质量Objective-C代码(三) iOS 编写高质量...

MrLiuQ
2018/08/13
0
0
IOS 浅谈闭包block的使用

前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧。 ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变...

周雨奇
2018/07/23
0
0
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
IOS内存常见问题与内存检查工具

iOS平台内存常见问题 作为iOS平台的开发者,是否曾经为内存问题而苦恼过?内存莫名的持续增长,程序莫名的crash,难以发现的内存泄漏,这些都是iOS平台内存相关的常见问题;本文将会详细介绍...

长平狐
2012/10/25
575
0
OC中的 成员变量,实例变量,属性变量

1. 成员变量 成员变量是定义在号中的变量。(yourButton、count、data都是成员变量) 成员变量用于类内部,无需与外界接触的变量。 2. 实例变量 如果成员变量的数据类型是一个类则称这个变量...

Andy_Ron
2018/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos 最小化安装后安装vmtools故障后解决方法

本文测试环境是centos7最小化安装方式。 安装vmtools时提示错误: What is the location of the "ifconfig" program on your machine?。 安装net-tools即可。 安装过程中可能还需要安装gcc,直...

白豆腐徐长卿
22分钟前
0
0
《人月神话》读后感

前两天看完了《人月神话》,最初是被这本书的名字吸引了,然后再在上搜了一下,人月确实是一个神话,那种不可能实现的神话……(!| ̄▽ ̄) 好久没有看过这种每章开始都引用一段名人名言的书了...

ninjaFrog
昨天
4
0
matlab-线性代数 施密特正交化

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% 施密特正......

志成就
昨天
3
0
08 分支管理 —— 多人协作

08 分支管理 —— 多人协作 多人协作 本节内容: 查看远程库信息,使用git remote -v;本地新建的分支如果不推送到远程,对其他人就是不可见的;从本地推送分支,使用git push origin bra...

lwenhao
昨天
6
0
开始使用Filebeat

认识Beats Beats是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash或Elasticsearch。 (画外音:通俗地理解,就是采集数据,并上报到...

北极南哥
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部