----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法"。很多高级语言中都有这种点语法,为了让其他行业的程序员快速上手OC,OC中也引入了点语法,只不过它的含义跟Java不太一样。
在正式学习OC的点语法之前,先来看一下传统的set方法和get方法。定义一个Car类,拥有一个成员变量_speed和对应的set方法和get方法。
1.Person.h
#import <Foundation/Foundation.h>
@interface Car : NSObject {
int _speed;
}
- (void)setSpeed:(int)speed;
- (int)speed;
@end
在第4行定义了一个成员变量age,默认是@protected权限的,所以外界不能直接访问它。
在第7、8行分别声明了age变量的set方法和get方法。
2.Person.m
#import "Car.h"
@implementation Car
//set方法实现
- (void)setSpeed:(int)speed {
_speed = speed;
}
//get方法实现
- (int)speed {
return _speed;
}
@end
一、通过传统的set和get方法来设置和取出成员变量的值
#import <Foundation/Foundation.h>
#import "Car.h"
int main()
{
Car *c = [[Car alloc] init];
// 通过set方法设置_speed的值
[c setSpeed:10];
// 通过get方法取出_speed的值
int speed = [c speed];
NSLog(@"speed is %i", speed);
[c release];
return 0;
}
传统的set和get方法是通过
方法的调用[c setSpeed:10]和[c speed]来分别设置和取出_speed的值。二、使用点语法代替传统的get方法和set方法来设置和取出成员变量的值
#import <Foundation/Foundation.h>
#import "Car.h"
int main()
{
Car *c = [[Car alloc] init];
// 通过set方法设置_speed的值
c.speed = 10;//等价于[c setSpeed:10];
// 通过get方法取出_speed的值
int speed = c.speed;//等价于int speed = [c speed];
NSLog(@"speed is %i", speed);
[c release];
return 0;
}
点语法是编译器特性,第9行
的c.speed并
不是
代表直接访问s对象的成员变量_speed,而是编译器遇到c.speed = 10的时候会自动将代码展开成[c setSpeed:10];其实还是调用的set方法,第12行的c.speed并不是直接访问c对象的成员变量_speed,而是编译器遇到int speed = c.speed;
的时候会自动将代码展开成int speed = [c speed];其实还是调用的get方法。
因此,OC中点语法的含义跟Java是完全不一样的,OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法,那就取决于你是取值还是设值,取值就是get方法(如第12行代码),设值就是set方法(如第9行代码)。
三、点语法注意:
- (void)setSpeed:(int)speed
{
self.speed = speed;
}
OC点语法本质是方法调用,所以第3行还是调用set方法,set方法里面调用set方法,故会引发死循环。