可见度
OC的实例变量可见度有四种:@package,@public , @protected, @private。
因为package比较少用,这里先不提。那么就剩下三种了。
类内:在类接口和实现以内。
类外:在类接口和实现之外。
在类外如果想直接使用实例变量,必须使用@public来修饰可见度,否则不能直接操作实例变量。
@public
在类内和类外都可以直接使用,并且可以被继承。虽然这样的可见度,对我们来说很方便,但是对程序内部细节的保护没有一点帮助,因此,@public最好不用。
@protected
如果在声明成员变量的时候,没有对其使用可见度描述,则这些实例变量的默认可见度是protected的。
protected,在类外不能使用,在类内可以使用,可以被继承(这是与private的区别)。
@private
私有可见度,描述的实例变量,在类内可以使用,在类外不能使用,并且不能被继承。
例子:
Student.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//2015年04月14日10:05:55 北京
//实例变量指的是能否看见实例变量。
//类外:在类接口和实现以外,必须是@public
//类内:在类接口和实现以内,
//如果想要在类外使用实例变量,必须描述为@public,否则无法直接使用。
@public //禁止使用 //@public,类内类外都可以直接使用 //可以被继承 NSString *_name;
//如果没有可见度描述,默认是受保护的,即@protected。 @protected //类外不能使用 //类内可以使用 //可以被继承 NSString *_sex;
@private //类外不能使用 //类内可以使用 //不能被继承 NSString *_num;
//可见度描述是可以写多次的。 //但是尽量不要写多次。 @public NSString *_color;
} - (void) sayHi;
@end |
Student.m文件
#import "Person.h"
@implementation Person
- (void) sayHi{
NSLog(@"%@",_name); NSLog(@"%@",_sex); NSLog(@"%@",_name); } @end |
main.m文件
#import <Foundation/Foundation.h> #import "Person.h"
int main(int argc, const char * argv[]) { @autoreleasepool {
Person *p1 = [[Person alloc]init];
p1->_name = @"123"; // p1->_num = @"123";//私有的,报错 // p1->_sex = @"123";//保护的,报错
} return 0; } |