Objective C2.0学习(十五 作用域)

来源:互联网 发布:商品套餐 数据库设计 编辑:程序博客网 时间:2024/06/04 18:52
几个常见的不同变量作用域:
@protected:
这个指令后面的实例变量可被类及任何子类中定义的方法直接访问。这个是默认情况

@private:
这个指令后面的实例变量可被定义在该类的方法直接访问,但不能被子类中定义的方法直接访问

@public:
这个指令后面的实例变量可悲该类中定义的方法直接访问,也可被其他类或者模块中定义的方法访问

@package:
对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量。(啥意思?)

一个Printer类,包含两个私有实例变量pageCount和tonerLevel,且只能在该类中被访问
Printer.m
@interface Printer: NSObject
{
@private
   int pageCount;
   int tonerLevel;

@protected
   //other instance variables
}

...
@end

外部变量:
如果在程序开始处(所有方法,类定义和函数定义之外)编写一下语句:
int gMoveNumber = 0;
那么这个模块中的任何位置都可以引用到该值。这种情况,該值就是全局变量,按照惯例,用小写的g作为全局变量的首字母。
这样的设置是的其他文件也可以同样访问gMoveNumber的值。不仅是全局变量,也是外部全局变量。

外部变量是可悲其他任何方法货函数访问和改变其值的变量。在需要访问外部变量的模块中。变量声明都一样。只需要在声明前加上关键字extern。就告诉系统,要访问其他文件中定义的全局变量。
extern int gMoveNumber;

main.m文件:
#import "Foo.h"
int gGlobalVar = 5; 全局变量
int main (int argc, char *argc[])
{
...
Foo *myFoo = [[Foo alloc] init];
NSLog (@"%i", gGlobalVar);
[myFoo setgGlobalVar: 100];
NSLog (@"%i", gGlobalVal);
..
}

-(void) setgGlobalVar: (int) val
{
extern int gGlobalVar;
gGlobalVar = val;
}

在前面程序中,gGlobalVar定义为全局变量,因此任何方法只要正确滴使用extern声明,都可以访问它。

结果是:
5
100

这就证明了方法setgGlobalVar:可以访问和改变外部变量gGlobalVar的值。

静态变量:
前面琐事的例子与数据封装原则以及良好的面向对象编程技术违背。然而,可能需要下面这种变量:他们的值在经过不同的方法调用时是共享的。
原创粉丝点击