在OC中,当我们初学OC用到“.”时,你有没有疑惑过,它到底是setter?还是getter?,还是其它什么鬼东西。最近一个开始学OC的朋友问到过我这个问题,今天在这里总结一下,希望对诸位有用。
1. C运算符
由于OC是C语言的超集,完全兼容C语言,所以访问结构体和共用体的成员对象的“.”运算符,在OC项目中,我们也经常用到,譬如最最常见的取UI控件Frame的成员对象。
C语言中“.”运算符的含义:成员选择(对象);用法:对象.成员名;
与之相似,可以访问成员的运算符还有“->”运算符:成员选择(指针);用法:对象指针->成员名。
两者都可以访问结构体成员,很容易混淆,我们通过一段代码对比两者之间的区别。
以OC中得CGSize为例。
//CGSize在OC中得定义如下
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
// 通过两种运算符设置height
struct CGSize size;
struct CGSize *sp = &size;
sp->height = 10;
size.height = 10;
(*sp).height = 10;
(&size)->height= 10;
通过上面代码,很容易分辨出两种运算符之间的区别:“.”通过地址偏移访问结构体成员,“->”是通过指针访问结构体成员。OC作为面向对象的语言,不需要开发者过多关注数据存储的地址,所以在OC中,基本使用“.”运算符来访问结构体成员。
2. setter和getter方法
OC中最常用的点语法,其本质就是隐式的调用对象属性的setter和getter方法,这是学习OC需要掌握的基本知识,使用时注意setter和getter中self的循环调用问题。具体讲解可以参考下面这位博主的文章,这里不再赘述。
3. 链式语法
可以通过点语法调用,只有返回值,没有传入参数的对象方法和类方法。
这种语法很少使用,在使用时,通常没有方法名提示,比较容易出错,并不推荐使用。
下面,让我们建一个IOS工程,通过一段简单的代码看一下如何使用。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSInteger num = 0;
self.test0;
num = self.test1;
ViewController.test2;
num = ViewController.test3;
}
- (void)test0 {
NSLog(@"test0");
}
- (NSInteger)test1 {
NSLog(@"test1");
return 10;
}
+ (void)test2 {
NSLog(@"test2");
}
+ (NSInteger)test3 {
NSLog(@"test3");
return 20;
}
@end
运行结果如下:
当返回值为空时,使用该语法,Xcode会报警告,如下图
但并不影响程序的正常运行输出。