三、oc中成员变量作用域的学习

来源:互联网 发布:java小游戏开发 编辑:程序博客网 时间:2024/05/17 04:30

------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------

        作用域,在日常生活中是指,某种东西能够起到作用范围。在c语言已经c++语言中,我们也常听到过作用域一词,例如局部变量的作用域,全局变量的作用域。局部变量是指,这个变量只在局部有作用。比如说在一个函数里面声明一个int a;那么这个int a对象只能在此函数范围内起到作用,一旦函数调用完毕,系统将会自动释放掉该部分的内存,那么在函数范围外来使用a变量,一般会出现报错。全局变量,是指在整个程序或者整个文件中可以使用的变量,他会随着程序的开始而出现,随着程序的结束而结束。

        oc作为c语言的一个扩张集语言,他继承了c语言的一些优点,同时,又把c语言中比较繁杂的语法通过封装进行屏蔽掉,时开发者进行程序开发时,不是将注意力集中在语法方面,而是更多的集中在应用程序的功能以及实现上。

      oc中成员变量的作用域分为三种:

      1. public类型:公有类型,拥有着最广的作用域,可以在main函数、该类、该类的子类中直接访问

      2.private类型:私有类型,只能在该类中直接访问

      3.protected类型:保护类型,可以在该类以及该类的子类中直接访问


    public类型代码演示:

#import<Foundation/Foundation.h>@interface Mac : NSObject{  @public  // 定义_core与_price为公有类型的成员变量    int _core;    double _price;}@end@implementation Mac@end@interface MacBook : Mac // Macbook类继承Mac类@end@implementation MacBook@endint main(){    Mac *m = [[Mac alloc] init]; // 新建Mac对象    MacBook *b = [[MacBook alloc] init]; //新建MacBook对象       /*对公有类型对象赋值,并且进行打印,用于检测是否赋值成功*/    m->_core = 4;    m->_price = 14288;    NSLog(@"%d %.2f",m->_core,m->_price);        b->_core = 2;    b->_price = 9288;    NSLog(@"%d %.2f",b->_core,b->_price);        return 0;}

     

       由上面的代码的结果,可知,公有类型的成员变量,可以通过->运算符,进行直接赋值操作,也就是常说的,可以直接访问,无论是在该类、子类、main函数中。初学者要注意,尤其是有过c++编程基础的同学,容易在写成@public:,这样写是不正确的,@public后面不需要加冒号,并且在此后面写的成员变量,编译器都会认为是public类型。

   private类型代码演示:

#import<Foundation/Foundation.h>@interface Mac : NSObject{  @private  // 定义_core与_price为私有类型的成员变量    int _core;    double _price;}@property int core; // 声明_core的setter方法与getter方法@property double price; // 声明_price的setter方法与getter方法@end@implementation Mac@end@interface MacBook : Mac // Macbook类继承Mac类@end@implementation MacBook@endint main(){    Mac *m = [[Mac alloc] init]; // 新建Mac对象    MacBook *b = [[MacBook alloc] init]; //新建MacBook对象       /*对私有类型对象赋值,并且进行打印,用于检测是否赋值成功*/    m.core = 6; // 通过点语法调用setter方法进行赋值    m.price = 10000; // 同上    NSLog(@"%d %.2f",m.core,m.price); // 通过点语法调用getter方法进行赋值        b->_core = 4;  // 子类对象尝试直接访问父类中的对象,这样是不可取的,会报错    b->_price = 9988; // 错误同上    NSLog(@"%d %.2f",b->_core,b->_price); // 错误同上        return 0;}
   上面代码会出现报错,如下:
  

    

   由上面的错误,以及代码中的注释可知,私有类型的成员变量,不能被子类直接访问,但是,可以通过setter方法与getter方法,进行间接访问,代码如下:

#import<Foundation/Foundation.h>@interface Mac : NSObject{  @private  // 定义_core与_price为私有类型的成员变量    int _core;    double _price;}@property int core; // 声明_core的setter方法与getter方法@property double price; // 声明_price的setter方法与getter方法@end@implementation Mac@end@interface MacBook : Mac // Macbook类继承Mac类@end@implementation MacBook@endint main(){    Mac *m = [[Mac alloc] init]; // 新建Mac对象    MacBook *b = [[MacBook alloc] init]; //新建MacBook对象       /*对私有类型对象赋值,并且进行打印,用于检测是否赋值成功*/    m.core = 6; // 通过点语法调用setter方法进行赋值    m.price = 10000; // 同上    NSLog(@"%d %.2f",m.core,m.price); // 通过点语法调用getter方法进行赋值        b.core = 4; // 调用setter方法,给对象b中的_core赋值    b.price = 9988; // 调用setter方法,给对象b中的_price赋值    NSLog(@"%d %.2f",b.core,b.price); // 调用getter方法,返回p对象的_core与_price,并且打印进行检测        return 0;}
     虽然_core与_price设置成了父类中的私有类型的成员变量,子类中新建的对象,不能直接访问它们,但是可以通过相应的setter与getter方法,进行间接访问。MacBook类继承了Mac类,那么说明MacBook类中,有用Mac类中所有的成员变量,以及方法。子类调用方法时,优先在子类中寻找方法,如果找不到,则会进去父类中去寻找相应的方法。

    protected类型代码演示:

#import<Foundation/Foundation.h>@interface Mac : NSObject{  @protected  // 定义_core与_price为保护类型的成员变量,其实默认情况下(即是在不写明成员变量类型的情况下),成员变量默认是保护类型    int _core;    double _price;}@property int core; // 声明_core的setter方法与getter方法@property double price; // 声明_price的setter方法与getter方法@end@implementation Mac@end@interface MacBook : Mac // Macbook类继承Mac类- (void)test;@end@implementation MacBook- (void)test{    NSLog(@"_core = %d",[self core]); // 子类中访问父类中的protected类型的成员变量}@endint main(){    Mac *m = [[Mac alloc] init]; // 新建Mac对象    MacBook *b = [[MacBook alloc] init]; //新建MacBook对象        b.core = 10;    [b test]; // 用于检测赋值是否成功        return 0;}

       

      在类声明,也就是@interface里面,定义成员变量,默认如下,就是在不写明的情况下,系统是默认为保护类型的成员变量,也就是说该成员变量,可以在该类与子类中直接访问,直接赋值或者返回一个值。

      最后,需要注意一点的事,不仅仅是在类声明中可以写成员变量,其实在类的实现中也可以写成员变量。在类实现中写的成员变量,默认类型是private类型。并且就算在声明前面强行加上@public也无法变成公有类型,因为xcode在执行程序的时候,会将所有的.m文件一起进行编译,在.m文件里面声明的成员变量,只被该.m文件所知道,不被其他类所知道,因此为该类的私有类型成员变量,如果要声明成为公有或者是保护类型,必须在.h文件里面进行相应声明。一般情况下,并不提倡使用在.m文件中进行成员变量的声明,因为这样无法改变成员变量的类型,对于拥有继承关系的子类,不便于直接访问父类中的对象。


0 0
原创粉丝点击