3.OC -- 点语法
1、方法名
// 冒号也是属于方法名的一部分
- (void)setAge:(int)age; // 方法名是 setAge:
- (void)setAge; // 方法名是 setAge
- (void)setAge:(int)age andNo:(int)no; // 方法名是:setAge:andNo:
2、点语法
a)定义一个Person类,Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject {
// 在大括号里的私有变量age
int age;
}
// 声明私有变量age的set方法
- (void)setAge:(int)newAge;
// 声明私有变量age的get方法
- (int)age;
@end
b)Person.m
#import "Person.h"
@implementation Person
// 实现age的set方法
- (void)setAge:(int)newAge {
age = newAge;
}
// 实现age的get方法
- (int)age {
return age;
}
@end
c)main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 实例化一个person变量
Person *person = [[Person alloc] init];
// Person *person = [Person new];
// 调用set方法
// 相当于 [person setAge:20];
person.age = 20;
// 调用get方法
// 相当于 int age = [person age];
int age = person.age;
NSLog(@"age = %i", age);
}
return 0;
}
d)发现了上面的 person.age 了没?,它既可以是get方法,也可以是set方法,这得看他在等号的哪边。如果是在等号左边,编译器会把它当做set方法。反之,则是get方法。不信,我们可以在set方法和get方法里打印一下,测试就知道了。
Person.m
// 实现age的set方法
- (void)setAge:(int)newAge {
NSLog("调用了Person类的set方法");
age = newAge;
}
// 实现age的get方法
- (int)age {
NSLog("调用了Person类的get方法");
return age;
}
e)person.age 看起来好像是像 java 代码里调用 age 变量一样,所以为了避免混淆,我建议大家把私有变量的名字前面都加个下划线
Person.h
@interface Person : NSObject {
// 在大括号里的私有变量age
int _age;
}
Person.m
// 实现age的set方法
- (void)setAge:(int)newAge {
NSLog("调用了Person类的set方法");
_age = newAge;
}
// 实现age的get方法
- (int)age {
NSLog("调用了Person类的get方法");
return _age;
}
f)java代码里有这样子的set和get方法
// 一个简单的set方法,前提是已有了一个age私有变量
public void setAge(int age) {
this.age = age;
}
// get方法
public int getAge() {
return this.age;
}
那 OC 可以这样写吗,OC 有个 self 跟 java 的 this 很类似:
// 实现age的set方法
- (void)setAge:(int)newAge {
//_age = newAge;
self.age = newAge;
}
// 实现age的get方法
- (int)age {
return self.age;
}
如果这样写就完蛋了!请记住不要这样写!
1)get方法中的self.age代表什么,上面刚讲,在等号左边代表set方法,一直set方法无限循环下去了。。。
2)set方法中的self.age也是一样,代表的是get方法,一直get方法无限循环下去也是醉了。。。