• 10.2 作用域回顾
    • 10.2.1 控制实例变量作用域的指令">10.2.1 控制实例变量作用域的指令

    10.2 作用域回顾

    可以使用几种方式影响程序中变量的作用域。可以改变实例变量以及定义在函数外部或内部的普通变量的作用域。在下面的讨论中,我们使用术语模块(module)来引用包含在一个源文件中任何数目的方法或者函数定义。

    10.2.1 控制实例变量作用域的指令

    目前,你知道实例变量的作用域只限于为该类定义的实例方法。因此,任何实例方法都能直接通过变量名来访问该类的实例变量,而无需特别的操作。

    你还知道,实例变量可通过子类进行继承。继承来的实例变量同样可以通过变量名在该子类定义的方法中直接访问。同样,这也无需执行其他特别的操作。

    在接口部分声明实例变量时,可以把以下三个指令放在实例变量之前,以便更精确地控制其作用域,它们是:

    ·@protected—这个指令后面的实例变量可被该类及任何子类中定义的方法直接访问。这是默认的情况。

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

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

    ·@package—对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量。

    如果要定义一个名为Printer的类,它包含两个私有实例变量pageCount和tonerLevel,并且只有Printer类中的方法才能直接访问它们,那么可以如下使用接口部分:


    @interface Printer:NSObject

    {

    @private

    int pageCount;

    int tonerLevel;

    @protected

    //other instance variables

    }

    ……

    @end


    由于这两个实例变量均为私有的,所以任何从Printer派生子类的人都无法访问它们。

    这些特殊的指令和“开关”一样,所有出现在这些指令之后的变量(直到标志着变量的声明结束的右花括号为止)都有指定作用域,除非使用另一个指令。在前面的例子中,@protected指令确保它后面和}符号之前的实例变量可以被Printer的类方法访问,也可以被子类访问。

    @public指令使得其他方法或函数可以通过使用指针运算符(->)访问实例变量,这些内容将在第13章“基本的C语言特性”中详细讲述。将实例变量声明为公共的并不是良好的编程习惯,因为这违背了数据封装的思想(即,类隐藏它的实例变量)。