三、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文件中进行成员变量的声明,因为这样无法改变成员变量的类型,对于拥有继承关系的子类,不便于直接访问父类中的对象。
- 三、oc中成员变量作用域的学习
- OC成员变量的作用域
- OC 成员变量的作用域
- 黑马视频学习笔记-OC-点语法、成员变量的作用域
- 第六篇:OC类的成员变量的作用域
- OC基础—点语法、成员变量的作用域
- OC语言--成员变量作用域
- 关于OC成员变量作用域
- 黑马成员———OC学习第三天(成员变量作用域)
- 创建OC对象类、成员/静态变量、对象/类方法(★学习类的成员变量作用域,firecat推荐★)
- 成员变量的作用域
- 成员变量的作用域
- 成员变量的作用域
- OC点语法和成员变量作用域
- IOS开发---OC语言-⑬成员变量作用域
- oc中的点语法和成员变量作用域
- OC 点语法 和 成员变量作用域
- oc - 4 self 继承 多态 成员变量的作用域 @property id
- c++的类型转换
- STL 标准模板库 中栈stack 容器的使用
- 学习第一天
- 2.编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使用让这个程序能够处理的输入行的长度没有限制
- 【数据结构与算法】递归汉诺塔
- 三、oc中成员变量作用域的学习
- Android开源项目SlidingMenu深入剖析
- hadoop异常之 reduce拉取数据失败 (error in shuffle in fetcher)
- java中的i/o体系结构及流分类
- 《HeadFirst设计模式》学习笔记1-观察者模式
- Java 虚拟机运行时数据区介绍
- Algorithm
- IOS 如何持久化自定义对象(使用NSUserDefaults)
- Unity3D自动打包工具1