為啥要看OC中權(quán)限的使用:在寫一個(gè)分類的時(shí)候,發(fā)現(xiàn)用不了extern中的property,然后我將property移動(dòng)到了頭文件,發(fā)現(xiàn)不能使用下劃線變量的方式訪問,百思不得姐啊,O(∩_∩)O哈哈~,so 要再次看看OC中的權(quán)限問題,下面是我移動(dòng)到頭文件后的出錯(cuò)代碼
//QKLimitis 頭文件
@interface QKLimitis : NSObject
@property (nonatomic,copy)NSString *school;
@end
下面是他的一個(gè)分類
#import "QKLimitis+QKCategory.h"
@implementation QKLimitis (QKCategory)
- (void)userLimits
{
//這個(gè)可以使用
self.school = @"清華大學(xué)";
//報(bào)錯(cuò) Use of undeclared '_school'
_school = @"清華大學(xué)";
}
@end
我好奇心比較重,在分類里邊用_school報(bào)錯(cuò),那么在他的子類里邊會(huì)是啥樣子了?
@implementation FromLimitis
- (void)userLimits
{
//報(bào)錯(cuò) Instance variable '_school' is private
_school = @"清華大學(xué)";
//這個(gè)當(dāng)然可以用啦
self.school = @"清華大學(xué)";
}
@end
好家伙!分類里邊說找不到,子類里邊說是私有的,啦啦啦... 不過這事兒還不算完,為啥找不到了?我有做了個(gè)實(shí)驗(yàn),我把分類的和那個(gè)類寫在同一個(gè)文件,奇跡出現(xiàn)了,分類里邊竟然可以使用 _school 了
由此,對于proprety申明的東西,他的效果等于寫了set 和 get方法 加上在實(shí)現(xiàn)文件里邊申明了一個(gè)帶下劃線的@private的成員變量。
接下來,我們在來細(xì)看權(quán)限問題 我要測試子類,非子類中三種權(quán)限的訪問
#import <Foundation/Foundation.h>
@interface QKLimitis : NSObject
{
@private NSString *age;
@protected NSString *name;
@public NSString *country;
}
@property (nonatomic,copy)NSString *school;
@end
@interface FromLimitis : QKLimitis
@end
@interface OtherClass : NSObject
@end
@interface QKLimitis (Category)
@end
實(shí)現(xiàn)文件
#import "QKLimitis.h"
@implementation QKLimitis
- (void)userLimits
{
//自己里邊擁有所有權(quán)限
self->age = @"23";
self->name = @"李明";
self->_school = @"清華大學(xué)";
self.school = @"清華大學(xué)";
self->country = @"中國";
}
@end
@implementation FromLimitis
- (void)userLimits
{
//繼承類不可以訪問私有成員 下面兩行報(bào)private錯(cuò)
self->age = @"23";
self->_school = @"清華大學(xué)";
//但是可以訪問保護(hù)的成員
self->name = @"李明";
self->country = @"中國";
self.school = @"清華大學(xué)";
}
@end
@implementation OtherClass
- (void)userLimits
{
QKLimitis *limitis = [[QKLimitis alloc] init];
//非繼承類不僅不能訪問私有成員 下面兩行報(bào)private錯(cuò)
limitis->age = @"23";
limitis->_school = @"清華大學(xué)";
//還不可以訪問保護(hù)成員
limitis->name = @"李明";
limitis->country = @"中國";
limitis.school = @"清華大學(xué)";
}
@end
@implementation QKLimitis (Category)
- (void)userLimits
{
//寫在同一個(gè)文件里邊的分類實(shí)現(xiàn)擁有所有權(quán)限
self->age = @"23";
self->name = @"李明";
self->_school = @"清華大學(xué)";
self.school = @"清華大學(xué)";
self->country = @"中國";
_school = @"清華大學(xué)";
}
@end
總結(jié)一下
1.1 頭文件直接寫的成員變量
@interface QKLimitis : NSObject
{
@private NSString *age;
@protected NSString *name;
@public NSString *country;
}
@private 只在該類中使用
@protected 可以在繼承類中使用
@public 可以在其他類中使用
@private @protected @public 在分類中都可以使用
1.2 在頭文件聲明的 @property
@property (nonatomic,copy)NSString *school;
會(huì)生成 -(void)setSchool:(NSString)school;
-(NSString *)school;
和生成@private的_school,但這個(gè)不可以在分類中使用,如果要使用
需要在頭文件中顯示聲明_school.類似于_name是放在.m文件中的
最后,如果發(fā)現(xiàn)有不足或者有誤的地方,歡迎各路英雄好漢來指點(diǎn)。