成员变量的作用域
在OC中修饰成员变量的作用域,我们通常用下面的这几个关键字:
- @public
- @protected
- @private
- @package
1、@public
用@public 修饰成员变量表示:在任何地方都能直接访问对象的成员变量
eg:
#import <Foundation/Foundation.h> @interface Person : NSObject { @public int _age; // 定义一个public的成员变量_age } @end @implementation Person @end int main() { // 定义一个Person对象 Person *p = [Person new]; // 直接访问对象的_age 属性并赋值 p->_age = 100; return 0; } // 这个示例中,在main函数中直接访问成员变量
2、@protected
用@protected 修饰成员变量表示:成员变量只能在当前类及其子类的对象方法中直接访问
eg:成员变量只能在当前类及其子类的对象方法中直接访问,那么上述示例中在main函数中直接访问成员变量在这里肯定是不行的了。
#import <Foundation/Foundation.h> @interface Person : NSObject { @protected int _age; } // 对象方法输出年龄 - (void)test; @end @implementation Person // 对象方法test 输出年龄 - (void)test { NSLog(@"这个人的年龄是:%d", _age); } @end @interface Student : Person // 对象方法 - (void)test; @end @implementation Student - (void)test { NSLog(@"Student的年龄是:%d", _age); } @end int main() { // 定义一个Person对象 Person *p = [Person new]; // 调用对象方法test [p test]; // 定义一个Student对象 Student *stu = [Student new]; // 调用对象方法test [stu test]; return 0; }
3、@private
成员变量用@private 修饰表示:成员变量只能在当前类的对象方法中直接访问
eg:
#import <Foundation/Foundation.h> @interface Person : NSObject { @private int _age; } // 对象方法输出年龄 - (void)test; @end @implementation Person // 对象方法test 输出年龄 - (void)test { NSLog(@"这个人的年龄是:%d", _age); } @end
4、@package
成员变量用@package 修饰表示:只要在同一框架中,成员变量就能直接被访问。
5、总结
默认情况下成员变量的作用域是@protected的,@package一般情况下也是用得比较少,另外在@implementation中其实也是可以定义成员变量的,这里的成员变量默认就是@private的,不过需要注意的@interface和@implementation中定义的成员变量是不能同名的。