Objective-C中權(quán)限的使用

為啥要看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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • Google的Objective-C編碼規(guī)范 總覽 背景知識(shí) Objective-C是一個(gè)C語言的擴(kuò)展語言...
    渣渣程序猿愛次次大餐閱讀 1,722評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,621評論 18 399
  • 整理出的一些簡單實(shí)用的OC筆試題,如有錯(cuò)誤之處希望大家及時(shí)提出,以便修改,不誤人子弟.1、不會(huì)立刻使引用計(jì)數(shù)器改變...
    李xiao屁的憂傷閱讀 3,097評論 1 20
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,469評論 0 3

友情鏈接更多精彩內(nèi)容