[objc] view plaincopyprint?
- <span style="font-size:24px;">#import <Foundation/Foundation.h>
- @interface Person : NSObject
- {
- int _age;
- int age;
- int _height;
- int height;
- int _weight;
- int weight;
- int _money;
- int money;
- }
- @property int age;
- @property int height;
- @property int weight;
- @property int money;
- - (void)test;
- @end
- @implementation Person
- @synthesize height = _height;
- @synthesize weight;
- - (void)setMoney:(int)money
- {
- self->money = money;
- }
- - (int)height
- {
- return180;
- }
- - (int)age
- {
- return age;
- }
- - (void)test
- {
- NSLog(@"age=%d, _age=%d, self.age=%d", age, _age,self.age);// 0,10,0
- NSLog(@"height=%d, _height=%d, self.height=%d", height, _height,self.height);// 0,160,180
- NSLog(@"weight=%d, _weight=%d, self.weight=%d", weight, _weight,self.weight);// 50,0,50
- NSLog(@"money=%d, _money=%d, self.money=%d", money, _money,self.money);// 2000,0,0
- }
- /*
- 分析:第一行是打印成员变量age,_age,self.age的值,这里self代表调用方法的执行者,在main函数中是p在调用这个方法所以self.age等价于p.age,而p.age就是_age的getter方法,由于我们自己写了_age的getter方法的实现,所以直接调用我们自己写的方法,这里写的是return age,所以返回的是成员变量age的值,如果改成return _age或者不写这个方法,那么就返回_age的值,在main函数中p.age =10,p.weight = 50等都是赋值给带下划线的成员变量,所以第一行输出:0,10,0
- 第二行写了@synthesize height = _height;,如果后面改成不带下划线height,那么当我们执行self.height时,会默认访问height这个成员变量,如果没有,则会自动创建@private类型的height成员变量,所以输出: 0,160,180
- 这里涉及到成员变量的作用域问题:
- @public : 在任何地方都能直接访问对象的成员变量
- @private : 只能在当前类的对象方法中直接访问 @implementation中默认是@private)
- @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)
- @package : 只要处在同一个框架中,就能直接访问对象的成员变量
- 注意:@interface和@implementation中不能声明同名的成员变量
- 第三行写了个@synthesize weight;这个东西,这个东西代表默认访问weight这个成员变量而不是_weight这个成员变量,其他的跟上面原理一样,所以输出: 50,0,50
- 第四行写了
- - (void)setMoney:(int)money
- {
- self->money = money;
- }
- 这个是_money的setter方法的实现,所以当我们执行p.money = 2000的时候就会执行这段代码,self->money是将值赋给money这个成员变量,而不是_money这个成员变量,此时_money的值还是0,最后执行self.money是取出_money的值,所以最后的输出结果:2000 , 0, 0
- */
- @end
- int main()
- {
- Person *p = [Person new];
- p.age =10;
- p.weight =50;
- p.height =160;
- p.money =2000;
- [p test];
- return0;
- }</span>
黑马程序员_OC学习笔记之@property和@synthesize,布布扣,bubuko.com
时间: 2024-10-26 08:06:00