1.使用自定义的方法创建get/set方法
Person.h文件:
#import <Foundation/Foundation.h> @interface Person : NSObject { int age; } -(void)setAge:(int)newAge;//方法名是setAge: -(int)age;//方法名是age //-(void)setAge:(int)newAge AndNo:(int)no;//方法名是setAge:AndNo: @end
Person.m文件:
#import "Person.h" @implementation Person -(void)setAge:(int)newAge { age = newAge; } -(int)age { return age; } @end
main.m文件:
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *person = [[Person alloc]init]; [person setAge:10]; int age = [person age]; NSLog(@"age is %i",age); [person release]; } return 0; }
2.使用点语法访问成员
2.1在OC中点语法不是访问成员变量,而是隐式调用get/set方法:
-
person.age = 10等效于[person setAge:10];
-
int age = person.age等效于[person age];
Person *person = [[Person alloc]init];
//使用点语法访问成员和设置成员变量
person.age = 10;
int age = person.age;
NSLog(@"age is %i",age);
2.2通过在get/set方法中打印数据(或设置断点的方式),可以观察到方法的调用。
-(void)setAge:(int)newAge { NSLog(@"调用了setAge方法:%i",newAge); age = newAge; } -(int)age { NSLog(@"调用了age方法:%i",age); return age; }
运行代码的输出为:
2013-07-18 23:23:59.946 点语法[2314:303] 调用了setAge方法:10
2013-07-18 23:23:59.967 点语法[2314:303] 调用了age方法:10
2013-07-18 23:23:59.968 点语法[2314:303] age is 10
2.3注意,OC中,为了防止self.age误认为是访问成员变量age,所有的成员变量,推荐使用_age。
@interface Person : NSObject { int _age; }
2.4setAge方法中和age方法中的错误写法:
-(void)setAge:(int)newAge { NSLog(@"调用了setAge方法:%i",newAge); self.age = newAge; }
不能在setAge:方法中使用self.age = newAge,相当于在setAge:方法中调用[self setAge:newAge],出现死循环,输出:
2013-07-18 23:33:22.277 点语法[2336:303] 调用了setAge方法:10
2013-07-18 23:33:22.279 点语法[2336:303] 调用了setAge方法:10
2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10
2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10
-(int)age { NSLog(@"调用了age方法:%i",_age); return self.age; }
不能在age方法中使用return self.age,相当于return [self age];,出现了死循环,输出:
2013-07-18 23:36:30.506 点语法[2364:303] 调用了age方法:10
2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10
2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10
2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10
3.经过上面的学习,我们正规的写法应该是如下:
Person.h文件:
#import <Foundation/Foundation.h> @interface Person : NSObject { //1.使用_age声明成员,方式self.age访问成员变量的误解 int _age; } -(void)setAge:(int)newAge; //2.使用age成员的名称,命名get方法 -(int)age; @end
Person.m文件:
#import "Person.h" @implementation Person -(void)setAge:(int)newAge { _age = newAge; } -(int)age { return _age; } @end
main.m文件:
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *person = [[Person alloc]init]; //3.使用self.age语法,隐式的调用get/set方法 self.age = 10; int age = self.10; NSLog(@"age is %i",age); [person release]; } return 0; }