Objective-C中权限的使⽤
为啥要看OC中权限的使⽤:在写⼀个分类的时候,发现⽤不了extern中的property,然后我将property移动到了头⽂件,发现不能使⽤下划线
变量的⽅式访问,百思不得姐啊,O(∩_∩)O哈哈~,so要再次看看OC中的权限问题,下⾯是我移动到头⽂件后的出错代码
//QKLimitis头⽂件
@interfaceQKLimitis:NSObject
@property(nonatomic,copy)NSString*school;
@end
下⾯是他的⼀个分类
#import"QKLimitis+QKCategory.h"
@implementationQKLimitis(QKCategory)
-(void)urLimits
{
//这个可以使⽤
=@"清华⼤学";
//报错Uofundeclared'_school'
_school=@"清华⼤学";
}
@end
我好奇⼼⽐较重,在分类⾥边⽤_school报错,那么在他的⼦类⾥边会是啥样⼦了?
@implementationFromLimitis
-(void)urLimits
{
//报错Instancevariable'_school'isprivate
_school=@"清华⼤学";
//这个当然可以⽤啦
=@"清华⼤学";
}
@end
好家伙!分类⾥边说找不到,⼦类⾥边说是私有的,啦啦啦...不过这事⼉还不算完,为啥找不到了?我有做了个实验,我把分类的和那个类写在同
⼀个⽂件,奇迹出现了,分类⾥边竟然可以使⽤_school了
由此,对于proprety申明的东西,他的效果等于写了t和get⽅法加上在实现⽂件⾥边申明了⼀个带下划线的@private的成员变量。
接下来,我们在来细看权限问题我要测试⼦类,⾮⼦类中三种权限的访问
#import
@interfaceQKLimitis:NSObject
{
@privateNSString*age;
@protectedNSString*name;
@publicNSString*country;
}
@property(nonatomic,copy)NSString*school;
@end
@interfaceFromLimitis:QKLimitis
@end
@interfaceOtherClass:NSObject
@end
@interfaceQKLimitis(Category)
@end
实现⽂件
#import"QKLimitis.h"
@implementationQKLimitis
-(void)urLimits
{
//⾃⼰⾥边拥有所有权限
lf->age=@"23";
lf->name=@"李明";
lf->_school=@"清华⼤学";
=@"清华⼤学";
lf->country=@"中国";
}
@end
@implementationFromLimitis
-(void)urLimits
{
//继承类不可以访问私有成员下⾯两⾏报private错
lf->age=@"23";
lf->_school=@"清华⼤学";
//但是可以访问保护的成员
lf->name=@"李明";
lf->country=@"中国";
=@"清华⼤学";
}
@end
@implementationOtherClass
-(void)urLimits
{
QKLimitis*limitis=[[QKLimitisalloc]init];
//⾮继承类不仅不能访问私有成员下⾯两⾏报private错
limitis->age=@"23";
limitis->_school=@"清华⼤学";
//还不可以访问保护成员
limitis->name=@"李明";
limitis->country=@"中国";
=@"清华⼤学";
}
@end
@implementationQKLimitis(Category)
-(void)urLimits
{
//写在同⼀个⽂件⾥边的分类实现拥有所有权限
lf->age=@"23";
lf->name=@"李明";
lf->_school=@"清华⼤学";
=@"清华⼤学";
lf->country=@"中国";
_school=@"清华⼤学";
}
@end
总结⼀下
1.1头⽂件直接写的成员变量
@interfaceQKLimitis:NSObject
{
@privateNSString*age;
@protectedNSString*name;
@publicNSString*country;
}
@private只在该类中使⽤
@protected可以在继承类中使⽤
@public可以在其他类中使⽤
@private@protected@public在分类中都可以使⽤
1.2在头⽂件声明的@property
@property(nonatomic,copy)NSString*school;
会⽣成-(void)tSchool:(NSString)school;
-(NSString*)school;
和⽣成@private的_school,但这个不可以在分类中使⽤,如果要使⽤
需要在头⽂件中显⽰声明_school.类似于_name是放在.m⽂件中的
最后,如果发现有不⾜或者有误的地⽅,欢迎各路英雄好汉来指点。
本文发布于:2022-11-15 21:33:13,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/26827.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |