self.和_的区别(self和下划线的区别)

在最新的xcode中,已经不需要我们自己去写 set,get 方法,,系统已经自动帮我们生成set,get方法。

同时我们发现在我们访问我们声明的变量时,会有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(自动管理内存)的情况下虽然不存在上述问题,但从编码规范来考虑,还是注意点儿的好。

 

时间: 2024-12-08 10:41:07

self.和_的区别(self和下划线的区别)的相关文章

python 里面的单下划线与双下划线的区别(私有和保护)

Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 ——变量名_xxx被看作是“私有 的”,在模块或类外不可以使用.__xxx__ 系统定义名字 ——__xxx 类中的私有变量名 ——只有类对象自己能访问,连子类对象也不能访问到这个数据. 核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始.一般来讲,变量名_xxx被看作是“私有 的

python 里面的单下划线与双下划线的区别

python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下 划线作为变量名的开始.一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用. 当变量是私有的时候,用_xxx 来表示变量是很好的习

iOS中self.xxx 和 _xxx 下划线的区别

property (nonatomic,copy) NSString *propertyName; self.propertyName 是对属性的拜访: _propertyName 是对部分变量的拜访. 其1.@property的声明中,编译器正在天生g] @property (nonatomic,copy) NSString *propertyName; self.propertyName 是对属性的访问: _propertyName 是对局部变量的访问. 其一.@property的声明中,编

OC 中self. 与 下划线的区别

@property (nonatomic, copy) NSString *name; self.name  是对属性的访问   是在调用一个getter方法   会让引用计数器+1;   _name却不会. _name  是对局部变量的访问   引用计数不会增减 用self.name 是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下划线的时候忽视了self这个指针,_name容易在block中造成循环引用.

self和下划线的区别

主要是涉及到内存管理的问题.self.propertyName 使用self. 是对属性的访问.使用_ 是对局部变量的访问. 所有被声明为属性的成员,在ios5 之前需要使用编译器指令@synthesize 来告诉编译器帮助生成属性的getter,setter方法.之后这个指令可以不用人为指定了,默认情况下编译器会帮我们生成. 编译器在生成getter,setter方法时是有优先级的,它首先查找当前的类中用户是否已定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用

iOS-self.和下划线访问的区别

本文转载自iOS中self.和下划线的区别. 1.通过self.xxx的访问调用了方法:包含了set和get方法.而通过下划线的访问是获取自己的实例变量,不包含set和get的方法. 2.self.xxx是对属性的访问:而_xxx是对局部变量的访问.所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成. 译器在生成getter,setter方法时是有

PHP面试题之驼峰字符串转换成下划线样式例子

自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_strlen($str); $new = ''; for($i = 0; $i < $length; $i++){ $num = ord($str[$i]); $pre = ord($str[$i - 1]); $new .= ($i != 0 && ($num >= 65 &&

golang下在终端显示字体颜色及闪烁、下划线效果的小工具

在终端下打印不同颜色的字体,具体说明见:http://blog.csdn.net/gxut555/article/details/7913591 自己用golang实现一个,除了在MAC下显示不出效果来,其他端上还算正常了,效果所示: 代码如下(见:https://github.com/liuyongshuai/tofuutils/blob/master/cli_color.go): /* * @author Liu Yongshuai<[email protected]> * @packag

scala下划线

作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)=>Double) = f(3) compute: (f: Double => Double)Double //传递一个匿名函数作为compute的参数 scala> compute((x: Double) => 2 * x) res1: Double = 6.0 如果参数x在=>