黑马程序员---Objective-C基础学习---点方法使用和成员变量的作用域

一、点语法

oc设计点语法的目的就是让其他语言的开发者能快速上手oc这门语言,oc点语法与java里面很像,那什么是点语法呢,点语法怎么用呢?

1、点语法和set和get方法有关

这里新建一个项目,添加一个Person类

Person.h

 1 //
 2 //  Person.h
 3 //  zijia
 4 //
 5 //  Created by zou on 5/10/15.
 6 //  Copyright (c) 2015 __MyCompanyName__. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @interface Person : NSObject
12 {
13     int _age;
14     
15 }
16 
17 - (void)setAge:(int)age;
18 - (int)age;
19 @end

Person.m

 1 //
 2 //  Person.m
 3 //  zijia
 4 //
 5 //  Created by zou on 5/10/15.
 6 //  Copyright (c) 2015 __MyCompanyName__. All rights reserved.
 7 //
 8 
 9 #import "Person.h"
10 
11 @implementation Person
12 - (void)setAge:(int)age
13 {
14     _age = age;
15 }
16 - (int)age
17 {                
18     return _age;
19 }
20 @end

main.m

 1 //
 2 //  main.m
 3 //  zijia
 4 //
 5 //  Created by zou on 5/9/15.
 6 //  Copyright (c) 2015 __MyCompanyName__. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 
12 int main(int argc, const char * argv[])
13 {
14 
15     @autoreleasepool {
16         
17         Person *p = [Person new];
18         [p setAge : 10];
19         int a = [p age];
20         NSLog(@"age is %d",a);
21         
22     }
23     return 0;
24 }

这里是通过set个get方法来改变和获取成员变量的值,但是看起来有点古怪,可以使用点语法来替代。

p.age = 10; //[p setAge : 10];

点语法的本质还是方法调用,而不是访问成员变量,访问成员变量方法应该是:p->age=10。这里点语法了调用set方法,那get方法如何用点语法实现呢?

int a = p.age; // int a = [p age];

使用点语法需要注意点什么呢,看下面代码:

Person.m 

- (void)setAge:(int)age
{
    // _age = age;
    NSLog(@"setAge-");
    self.age = age;
}

这里set方法中,_age = age 能不能使用点语法 self.age = age代替呢?

self.age 相当于调用setAge方法[self setAge:age],这样程序又调用setAge方法,这样程序进入死循环。

打印输出:

 

如果在get方法实现中写return self.age则程序也进入死循环。

- (int)age
{                
    NSLog(@"age-");
    return self.age;
    // return _age;
}
@end

执行代码:

这里再一次说明了点语法本质是调用set方法。如果程序中有点语法而没有set和get方法,则程序会报错。

 

二、成员变量作用域

成员变量作用域分为四种:

1、@private: 只能在当前类的实现@implementation 中直接访问

2、 @protected: 可以在当前类以及子类的实现@implementation中直接访问

3、 @public: 任何地方都可以直接访问

4、 @package: 同一个“体系内”(框架)可以访问,介于@private和@public之间

在成员变量前面加上关键字,那么成员变量的作用域也随之改变。

子类能不能使用父类的私有成员变量呢?答案是不能,只能通过调用父类的set和get方法来访问父类的私有成员变量。

如果不写关键字,成员变量默认为@protected,只能被当前类以及子类的实现部分访问。

在实现部分定义的成员变量默认都是私有的。

posted on 2015-05-10 18:20  邹绍绍的博客  阅读(124)  评论(0编辑  收藏  举报

导航