Objective-C中@private、@protected、@public、@package 解析

Objective-C中,類的實例化變量的範圍有@private、@protected、@public。他們代表的意思和C++中相同,只是前面添加了一個@符號。下面介紹一下他們代表的範圍:

指令 意思

@private

作用範圍只能在自身類(實例變量只能被聲明它的類訪問
@protected 作用範圍在自身類和繼承自己的子類,什麼都不寫,默認是此屬性(實例變量能被聲明它的類和子類訪問,所有沒有顯式制定範圍的實例變量都是
@public 作用範圍最大,在任何地方(實例變量可以被在任何地方訪問
   
@package

使用modern運行時,一個@package實例變量在實現這個類的可執行文件鏡像中實際上是@public的,但是在外面就是@private(runtime需要再看一下蘋果文檔Runtime Programming GuideObjective-C中的@package與C語言中變量和函數的private_extern類似。任何在實現類的鏡像之外的代碼想使用這個實例變量都會引發link error,這個類型最常用於框架類的實例變量,使用@private太限制,使用@protected或者@public又太開放。


下面是一個例子,來說明他們之間的關係:

實現一個Boss類:

#import <Foundation/Foundation.h>

   

@interface Boss : NSObject 

@private 
    int age; 
@protected 
    NSString *job; 

@end

實現一個Worker類繼承Boss類:

#import <Foundation/Foundation.h> 
#import "Boss.h" 
@interface Worker : Boss 

    NSString *name; 
@private 
    NSString *evaluation; 
@protected 
    float wage; 
@public 
    NSString *boss; 

- promoteTo:newPosition; 
@end

在Worker的.m文件中添加:

#import "Worker.h"

   

@implementation Worker 
- promoteTo:newPosition 

    id old = job; 
    job = newPosition; 
    return old; 

-(NSString *)description 

    return [NSString stringWithFormat:@"Worker name:%@,evaluation:%@,job:%@,wage:%f,boss:%@",name,evaluation,job,wage,boss]; 

@end

如果我們在Worker中調用Boss中的私有變量age,會報錯:

Objective-C中@private、@protected、@public 解析

但是調用job是沒有問題的。

下面在其他類中調用Worker類:

Worker *ceo = [[Worker alloc] init]; 
   ceo->boss = @"XX"; 
   [ceo promoteTo:@"YY"]; 
    NSLog(@">>>=%@",[ceo description]);

運行結果:

Objective-C中@private、@protected、@public 解析圖2

但是調用protected的屬性會報錯:

Objective-C中@private、@protected、@public 解析圖3

所以當一些比較重要的屬性,不能隨便更改的時候,要用private,這樣避免其他繼承類修改此屬性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章