0%

iOS学习杂记

iOS学习杂记

在iOS路上不断学习,修修补补的自己的知识,随手记录一下

OC 点语法的本质

  • 点语法本质依然是方法调用,即消息发送的方式
  • 当使用点语法时,编译器其实会转换成,消息发送的方式
  • OC的点语法不过是一种语法糖,其本质没变
1
2
3
4
5
6
7
/*
Student 类声明了一个name属性和一个对象方法study
*/
Student * student = [[Student alloc] init];
student.name = @"Jack"; // 这句相当于[student setName:@"Jack"];
NSString * studentName = student.name; // 这句相当于 NSString * studentName = [student name];
student.study; // 相当于 [student study];
1
2
3
4
5
6
7
8
9
10
// 这是一个错误写法,会产生死循环
- (void)setName:(NSString *)name {
self.name = name; // 相当于[self setName:name];
// 所以就会一直递归调用setName:方法,导致死循环了
}

// 这也是一个错误写法,原因也是一样,会一直递归调用name方法,导致死循环
- (NSString *)name {
return self.name; // 相当于return [self name];
}

注意,如果是struct,那么点语法就是对成员变量的直接访问,编译器并不会转换成方法调用
struct访问成员变量的点语法,是C语言的点语法,和OC的点语法有所区别

NSLog打印对象的本质——description方法

1
2
// 假设有个student对象(继承于NSObject)
NSLog(@"%@",student); // 相当于NSLog(@"%@",[student description])

所以,我们可以通过重写-description方法来实现自定义打印内容,而且除了对象方法,还有类方法+description

1
2
3
4
// 假设有个Student 类
NSLog(@"%@",[Student description]);
// 输出结果:Student
// 类方法的输出是类名

通过重写-description+description可以自定义输出内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 在description里使用NSLog打印,可能会产生死循环
- (NSString *)description {
NSLog(@"%@",self);
return [super description];
}

// 不过在Xcode9.3上测试的结果,description里的NSLog只会执行三次

/* 输出结果(Xcode9.3)
description -- <Student: 0x60800000f240>
description -- <Student: 0x60800000f240>
description -- <Student: 0x60800000f240>
main -- <Student: 0x60800000f240>
*/