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

本文转载自iOS中self.和下划线的区别

1.通过self.xxx的访问调用了方法:包含了set和get方法。而通过下划线的访问是获取自己的实例变量,不包含set和get的方法。

2.self.xxx是对属性的访问;而_xxx是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。

译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx时是调用一个getter方法。会使引用计数加一,而_xx

不会使用引用计数加一的。所以使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在Block中造成循环引用。同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。

总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。

时间: 2024-11-08 20:26:39

iOS-self.和下划线访问的区别的相关文章

Python的类的下划线命名的区别

首先,单下划线开头,这个常被用于模块中,在一个模块中以单下划线开头的变量和函数被默认当做内部函数,如果使用from  module  import  *导入时,这部分变量和函数不会被导入.注意,如果使用import module导入模块,仍然可以用module._some_var这样的形式访问到这样的对象. 在Python官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和Python关键词区分开来,比如,如果我们需要一个变量叫做class,但class是P

iOS 蛇形式(下划线)命名转化为驼峰式

在解析json的时候,经常json的变量名都是蛇行式(下划线)命名法来命名的,所以写了一个类方法来转换. + (NSString *)convertToCamelCaseFromSnakeCase:(NSString *)key { NSMutableString *str = [NSMutableString stringWithString:key]; while ([str containsString:@"_"]) { NSRange range = [str rangeOfS

结构体命名时加了下划线

举例: typedef struct _ssidCfg_{ unsigned char ret;  unsigned char scanSsid; unsigned char priority;  unsigned char encryption;  unsigned char ssid[32]; unsigned char passwd[32];}ssidCfg, *pSsidCfg; 加了下划线的命名只是为了说明此结构体变量是基本的那个变量,只是为了和后面没有加下划线的做区别而已

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

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

iOS初学,关于变量加下划线问题

为什么做ios开发,变量前要加下划线才有用? 看到这个哥们的解释后,终于明白了,转帖到此. 链接在此:http://www.cocoachina.com/bbs/read.php?tid=234290 在.m实现文件中,如果使用property,必须使用 self.property 的方式调用 getter 方法.顺便说一句,其实self.property其实就是调用了getter方法. oc语法关于点表达式的说明:"点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类

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

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

iOS @synthesize var = _var 变量前置下划线解释

本文转载至 http://blog.csdn.net/ztp800201/article/details/9231617 前置下划线是一种为了帮助区分实例变量和访问方法的约定.对于编译器来说它只是一种变量重命名而已. 考虑以下代码的区别(不使用ARC的情况下): self.date = [NSDate date]; // 正确,set方法首先释放原来的值 date = [NSDate date]; // 错误,省略set方法将导致内存泄露 _date = [NSDate date]; // 错误

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

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

OC 中self. 与 下划线的区别

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