OC中得那些“点”

原文在此

在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的循环调用问题。具体讲解可以参考下面这位博主的文章,这里不再赘述。

点这里:OC点语法

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会报警告,如下图

但并不影响程序的正常运行输出。

原文地址:https://www.cnblogs.com/xishuidongliu/p/5028859.html