内容简介:iOS疑难点总结,部分摘自参考链接在iOS中常见到如下写法:在上述写法中,
前言
iOS疑难点总结,部分摘自参考链接
正文
self.var还是_var?
在iOS中常见到如下写法:
@interface Demo () @property(nonatomic, strong) NSString *name; @end @implementation Demo - (void)test { _name = @""; // self.name = @""; } @end
在上述写法中, self.name
和 _name
有什么区别呢?
在解释其区别之前,需要先了解一下OC中的属性和实例变量,实例变量具有私有性,一般仅在类内部使用,为了方便给外界读写这个实例变量,就有了属性(@property)
在iOS第一版中,需要同时声明属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求必须声明与之对应的实例变量;如下:
// MyViewController.h @interface MyViewController : UIViewController { UIButton *myButton; // 实例变量 } @property (nonatomic, retain) UIButton *myButton; // 属性 @end
之后,苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量(即 var
属性及与其对应的 _var
实例变量),如下:
// MyViewController.h @interface MyViewController : UIViewController @property (nonatomic, retain) UIButton *myButton; // 将自动创建一个_myButton实例变量与之对应 @end
在MyViewController.m中可以直接使用 _myButton
实例变量,也可以通过self.myButton来访问,二者的区别也是下面要讲解的;
再来看下面一个例子:
// MyViewController.h @interface MyViewController : UIViewController { NSString *name; // 实例变量 } @end
在MyViewController.m文件中,如果通过self.name访问的话,编译器会报错,Xcode会提示使用->,即使用self->name,这是因为OC中点表达式表示调用方法,而这里的name是一个实例变量,没有与其对应的name方法
另外,还有一个与@property合用的@synthesize,通过@synthesize还可以指定与属性对应的实例变量名,如下:
// MyViewController.h @interface MyViewController : UIViewController @property (nonatomic, retain) UIButton * myButton; @end // MyViewController.m @implementation MyViewController @synthesize myButton = otherButton; @end
此时,与属性myButton对应的实例变量名为otherButton了,默认的 _myButton
就不能使用了;还需要注意的一点是,如果只是声明了 @synthesize myButton;
,那么此时默认与myButton对应的实例变量名为myButton, _myButton
也不能用了
到这里我们应该知道了使用 self.var
与 _var
的区别,即self.var实际上是调用了属性方法,即getter和setter方法,而 _var
是直接调用的实例变量,不会走getter和setter方法;因此,这里需要注意的是,当我们要重写getter方法时,在getter方法中必须使用 _var
实例变量,否则会造成getter方法的递归调用;同理,重写setter方法时,在setter方法中也只能使用 _var
实例变量,否则也会造成settter方法的递归调用;另外,直接访问实例变量的话,就不会调用其setter方法,这样就绕过了为相关属性所定义的内存管理语义。例如:在ARC下直接访问一个语义为copy的属性,那么并不会copy该属性,而仅仅是保留新值并释放旧值
参考链接:
- https://www.jianshu.com/p/48056965ddce
- http://www.cnblogs.com/crazypebble/archive/2013/11/23/3439261.html
@property与@synthesize
我们知道@property可用于在头文件中声明getter和settter方法,@synthesize方法可用于.m文件中实现getter和setter方法;但是实际情况是,如果我们只是在头文件中使用了@property,而没有在.m文件中使用@synthesize,编译器实际上还是会为我们生成getter和setter方法;这是因为从Xcode 4.4 开始,@synthesize属性是默认声明了的
参考链接:
- https://stackoverflow.com/questions/7496463/objective-c-property-declaration-without-implementation-synthesize
扩展(extension)与分类(category)
参考链接:
- https://www.jianshu.com/p/9e827a1708c6
- https://blog.csdn.net/hherima/article/details/44242469
宏定义中的do{}while(0)使用
参考链接:
- https://blog.csdn.net/luoweifu/article/details/38563161
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
文明之光 (第三册)
吴军 / 人民邮电出版社 / 2015-1-1 / 59
【《文明之光》系列荣获由中宣部、中国图书评论学会和中央电视台联合推选的2014“中国好书”奖】 吴军博士从对人类文明产生了重大影响却在过去被忽略的历史故事里,选择了有意思的几十个片段特写,以人文和科技、经济结合的视角,有机地展现了一幅人类文明发展的宏大画卷。 《文明之光 》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段,每个章节相对独立,全景式地展现了人类文明发展历程......一起来看看 《文明之光 (第三册)》 这本书的介绍吧!