成员访问权限
@interface FBAnimal : NSObject
{
int _food1;
@private
int _food2;
@protected
int _food3;
@package
int _food4;
@public
int _food5;
}
@end
@interface FBAnimal ()
{
int _food6;
@private
int _food7;
@protected
int _food8;
@package
int _food9;
@public
int _food10;
}
@end
@implementation FBAnimal
{
int _food11;
@private
int _food12;
@protected
int _food13;
@package
int _food14;
@public
int _food15;
}
@end
@interface FBDog : FBAnimal
- (void)feed;
@end
@implementation FBDog
- (void)feed
{
_food1 = 1;
//_food2 = 2; //private
_food3 = 3;
_food4 = 4;
_food5 = 5;
//_food6 = 6; //private
//_food7 = 7; //private
_food8 = 8;
_food9 = 9;
_food10 = 10;
//_food11 = 11; //private
//_food12 = 12; //private
_food13 = 13;
_food14 = 14;
_food15 = 15;
}
@end
@interface FBHusky : FBDog
- (void)feed;
@end
@implementation FBHusky
- (void)feed
{
_food1 = 1;
//_food2 = 2; //private
_food3 = 3;
_food4 = 4;
_food5 = 5;
//_food6 = 6; //private
//_food7 = 7; //private
_food8 = 8;
_food9 = 9;
_food10 = 10;
//_food11 = 11; //private
//_food12 = 12; //private
_food13 = 13;
_food14 = 14;
_food15 = 15;
}
@end
void member_access_privilege()
{
FBAnimal *animal = [[FBAnimal alloc] init];
//animal->_food1 = 1; //protected
//animal->_food2 = 2; //private
//animal->_food3 = 3; //protected
animal->_food4 = 4;
animal->_food5 = 5;
//animal->_food6 = 6; //private
//animal->_food7 = 7; //private
//animal->_food8 = 8; //protected
animal->_food9 = 9;
animal->_food10 = 10;
//animal->_food11 = 11; //private
//animal->_food12 = 12; //private
//animal->_food13 = 13; //protected
animal->_food14 = 14;
animal->_food15 = 15;
FBDog *dog = [[FBDog alloc] init];
//dog->_food1 = 1; //protected
//dog->_food2 = 2; //private
//dog->_food3 = 3; //protected
dog->_food4 = 4;
dog->_food5 = 5;
//dog->_food6 = 6; //private
//dog->_food7 = 7; //private
//dog->_food8 = 8; //protected
dog->_food9 = 9;
dog->_food10 = 10;
//dog->_food11 = 11; //private
//dog->_food12 = 12; //private
//dog->_food13 = 13; //protected
dog->_food14 = 14;
dog->_food15 = 15;
FBHusky *husky = [[FBHusky alloc] init];
//husky->_food1 = 1; //protected
//husky->_food2 = 2; //private
//husky->_food3 = 3; //protected
husky->_food4 = 4;
husky->_food5 = 5;
//husky->_food6 = 6; //private
//husky->_food7 = 7; //private
//husky->_food8 = 8; //protected
husky->_food9 = 9;
husky->_food10 = 10;
//husky->_food11 = 11; //private
//husky->_food12 = 12; //private
//husky->_food13 = 13; //protected
husky->_food14 = 14;
husky->_food15 = 15;
}
总结
- 成员访问权限大小:@public > (@package,@protected) > @private
- 成员访问权限只能修饰数据成员,数据成员定义在primary class interface或extension或primary class implement的{}内
- 成员访问权限不能修饰方法成员(方法成员访问权限一概为@public),方法成员定义或实现在primary class interface或extension或primary class implement的{}外
- 数据成员在primary class interface中默认访问权限为@protected,在extension或primary class implement中默认访问权限为@private
- package指编译后生成的同一静态库,同一framework,同一可执行文件,@package访问权限指同一package内可访问
- 成员访问权限只是oc代码层次的控制机制(从业务逻辑层面考虑),因此编译阶段有区别,但在目标代码层次无区别,因此链接阶段无区别
注1:项目引用静态库或framework时,项目只是依赖静态库或framework,并不属于同一package,因此不能访问@package访问权限成员
注2:类继承一概为public继承