——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
使用自定义的方法创建get/ set方法
先定义一个类Person:
类的声明
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
int _age;
}
-(NSString *)name;
-(void)setName:(NSString *)name;
-(int)age;
-(void)setAge:(int)age;
@end
类的实现:
#import "Person.h"
@implementation Person
-(NSString *)name{
NSLog(@"调用name的get方法");
return _name;
}
-(void)setName:(NSString*)name{
NSLog(@"调用name的set方法");
_name = name;
}
-(int)age{
NSLog(@"调用age的get方法");
return _age;
}
-(void)setAge:(int)age{
NSLog(@"调用age的get方法");
_age = age;
}
@end
main函数中:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.name = @"小明";
p.age = 15;
NSLog(@"name is %@,age is %d",p.name,p.age);
}
return 0;
}
可以看到执行结果为:
2015-09-19 12:09:36.792 点语法[1161:37353] 调用name的set方法
2015-09-19 12:09:36.792 点语法[1161:37353] 调用age的get方法
2015-09-19 12:09:36.793 点语法[1161:37353] 调用name的get方法
2015-09-19 12:09:36.793 点语法[1161:37353] 调用age的get方法
2015-09-19 12:09:36.793 点语法[1161:37353] name is 小明,age is 15
点运算符在OC的类对象中不能访问成员变量,如p.age=15,这里不是使用成员变量age,而是调用成员方法setAge,相当于给p.age赋值时,调用方法[p setAge:15]。
NSLog(@”%d”,p.age); 这里也不是使用成员变量age,而是调用成员方法age,使用p.age表达式的值时,实际上就是调用成员方法age,
[p age]。
“. ”不能调用成员变量,只是调用set函数和get函数的一种简写。这里不能理解为,定义了get函数和set函数就能调用成员变量,因为将这两个函数,不以一般形式书写时,使用p.age时,就会报错。
get和set函数的一般写法为:
Set函数
setter函数,对成员变量赋值。Set函数的一般写法以对age操作为例,写法为:
-(void)setAge:(int)newage。
Get函数
getter函数,对成员变量取值。Get函数的一般写法也以对age的操作为例,写法为:
-(int)age;
注意,OC中,为了防止self.age误认为是访问成员变量age, 所有的成员变量,推荐使用_age 。
点语法误区:
不能在setAge:方法中使用self.age = age,相当于在setAge:方法中调用 [self setAge:age ], 出现死循环,如 :
同样也不能在age方法中使用return self.age, 相当于return [self age];, 出现了死循环,如 :