首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 訪問控制符完整指南:@private、@public、@protected、@package 差異解析

     編輯:關於C語言

Objective-C 訪問控制符完整指南

在 Objective-C 中,成員變量(實例變量)的可見性由四個訪問控制符決定。掌握它們的差異,能幫助你設計更安全、封裝性更好的類。本文將逐一解析 @private、@public、@protected、@package 的行為,並附上記憶表格與實戰範例。

四大訪問控制符速查表

控制符同一類別同一映像子類別全域(外部)
@private✅ 可訪問❌ 不可❌ 不可❌ 不可
@package✅ 可訪問✅ 可訪問❌ 不可❌ 不可
@protected✅ 可訪問❌ 不可✅ 可訪問❌ 不可
@public✅ 可訪問✅ 可訪問✅ 可訪問✅ 可訪問

詳細解析

1. @private —— 最嚴格的封裝

標記為 @private 的實例變量,只有定義它的類別內部能夠直接存取。連子類別都無法訪問。這是實現資訊隱藏的首選。

2. @public —— 完全開放

@public 讓變量在任何地方都可見,包括外部程式碼透過 object->ivar 直接存取。雖然方便,但會破壞封裝性,**實務上極少使用**。

3. @protected —— 預設行為,支援繼承

若不寫任何控制符,預設即為 @protected。它允許當前類別與其子類別存取,但阻擋外部與同映像的其他類別。這是平衡封裝與擴展性的常用選擇。

4. @package —— 框架內部公開,對外隱藏

@package 是 Objective-C 2.0 引入的機制。所謂「同一映像」,指編譯產出的同一個 Framework 或執行檔。簡單說:

  • 同一 Framework 內的所有類別都能存取;
  • 引用該 Framework 的外部 App/Framework 則不可存取(除非同時標記 @public)。

這對於框架開發者極其有用:核心資料結構在框架內部可高效直存,對外卻保持封裝。

什麼是「同一映像」?

映像 = 編譯鏈接後產出的單一二進位單元(.framework、.dylib、或主執行檔)。同一個 Xcode Target 產出的二進位檔即屬同一映像。

實戰範例:使用 @package 保護框架內部狀態

// FKApple.h(框架公開介面)
#import 

@interface FKApple : NSObject
{
    @package
    double _weight;   // 框架內可直接讀寫,外部不可見
}
@end
// 框架內部實現檔(同一映像)
#import "FKApple.h"

@implementation FKApple
- (void)setWeight:(double)w { _weight = w; }   // ✅ 合法
- (double)weight { return _weight; }           // ✅ 合法
@end
// 外部 App 專案(不同映像)
#import 

int main() {
    FKApple *apple = [[FKApple alloc] init];
    apple->_weight = 30.4;   // ❌ 編譯錯誤:'_weight' is private
    return 0;
}

最佳實踐建議

  1. 預設用 @protected(或不寫),支援子類別擴展。
  2. 核心私有狀態用 @private,徹底封裝。
  3. 框架開發時善用 @package,兼顧內部效能與外部封裝。
  4. 避免 @public,改用屬性(Property)搭配存取方法控制權限。

小結

Objective-C 的四種訪問控制符形成了由嚴到鬆的四層防線:

@private ⊂ @package ⊂ @protected ⊂ @public

理解「映像」邊界,善用 @package,能讓框架設計更具彈性與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved