iOS中self与_的区别
同时我们发现在我们访问我们声明的变量时,会有self. 和 以"_"开头的访问方式,那么这两种方式到底有什么样的区别呢?
我们来一起看一下:
@property (retain, nonatomic) NSMutableArray *nameArray;
self.nameArray是访问属性的,而_nameArray是访问实例变量的.
属性是实例变量加上GET,SET方法的一个整合体,他主要是承担一个外部访问的一个接口!
实例变量只能在本类中才可以访问,外部不可以访问!
总的原则:
在类内部访问变量的时候用“_”;
在类外部也就是其他类里访问这个类的变量时用“.” 语法;
注意事项:
手动管理内存的情况下:
使用“.”语法来初始化变量的时候,会产生内存泄漏的问题:
self.nameArray = [NSMutaleArray alloc] init];
上述代码,造成的问题是,在self.nameArray的时候相当于调用了set方法,引用计数+1,后面alloc的时候,引用计数再次+1。
在我们最后dealloc中release的时候,引用计数只减了一次,并没有完成全部释放,这样就造成了内存泄漏的问题。
解决方法:就是用“_”来初始化以及访问变量,这样就不会产生内存问题,虽不是什么高明的办法,但的确有效。
_nameArray = [NSMutaleArray alloc] init];
上述便是“.”和“_”在使用的时候的简单区别。
如果是在ARC(自动管理内存)的情况下虽然不存在上述问题,但从编码规范来考虑,还是注意点儿的好。
iOS中self与_的区别的更多相关文章
- IOS 中frame与bounds的区别
文章摘要:http://www.sendong.com/news1733.html bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系 ...
- iOS中的#import和class区别
在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明,你们可能也见到在.h文件进用@class来声明的,那么#import和@class进行声明 到底有什么的区别呢?下 ...
- iOS中 Proxy和的delegate区别
在ios中使用proxy代理模式,经常容易和delegate委托模式混淆. 委托模式(delegate),是简单的强大的模式,可让一个对象扮演另外对象的行为.委托对象保持到另外对象的引用,并在适当的时 ...
- 【原】iOS中KVC和KVO的区别
在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...
- iOS中成员变量和属性区别
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- IOS中nil/Nil/NULL的区别
类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...
- ios 中 documents和library 的区别
简单来说就是用户在APP中输入并保存的数据放在Documents文件夹中(如用户输入的文本等), 并且如果手机连接电脑时,iTunes会自动备份其中文件,苹果不允许我们将下载的大型文件放入该文件夹. ...
- iOS中ASI和AFN的区别
一.底层实现 1> AFN的底层基于OC的NSURLConnection和NSURLSession 2> ASI的底层基于纯C语言的CFNetwork框架 3> ASI的运行性能 高 ...
- iOS中堆和栈的区别
管理方式: 对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作有程序员控制,容易产生memory Leak. 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块 ...
随机推荐
- 【转载】 Java:按值传递还是按引用传递详细解说
前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有 ...
- Python案例分享
1.过桥(爬金字塔): 1 i = 1 2 while i <= 9: 3 if i < 6: 4 j = 0 5 while j < i: 6 print('*',end=' ') ...
- python利用for..in遍历,while循环嵌套编译九九乘法表的几种模式
运用for....in...遍历的四种方向的九九乘法表: 左下角: import sysfor i in range(1,10): for j in range(1,i+1): sys.stdout. ...
- Oracle的窗口和自动任务
Oracle数据库自己会例行做一些定时任务,比如会自动进行统计信息收集等作业任务.如果统计信息收集的时间正好赶上业务的高峰期,那就有可能由此引发一系列性能故障. 那么,我们该如何查看这些数据库自动去做 ...
- E:I Think I Need a Houseboat-poj
E:I Think I Need a Houseboat 总时间限制: 1000ms 内存限制: 65536kB 描述 Fred Mapper is considering purchasing ...
- git使用(上)-----基本的方法
git应该是一项必须要掌握的工具.先简述它和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活 ...
- .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
最近难得有时间闲下来,研究了一下.net core 2.0,总的来说,目前除了一些第三方的库不支持外,基本上可以满足我们的项目需求了! 我们就以一个网站开发为例,搭建一个简单的三层架构,先熟悉一下.n ...
- Mybatis(一)实现单表的增删改查
1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- makefile 中=与:=的差别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y = $(x) bar ...
- HTTPS原理浅析
HTTPS(Hypertext Transfer Protocol Secure)协议用于提供安全的超文本传输服务. 其本质上是SSL/TLS层上的HTTP协议, 即所谓的"HTTP ove ...