iOS 靜態庫的深入理解之訪問許可權問題

2021-06-25 14:17:48 字數 1587 閱讀 9670

一直以為做靜態庫就是為了更好的封裝(開放該開放的介面,遮蔽一些內部實現細節)。直接的理解就是介面標頭檔案(.h)中沒有宣告的函式或類是不能訪問的。原來這個認識是錯誤的。

先上測試示例,在分析情況

製作了乙個.a靜態庫;裡面檔案有介面檔案(testdanlishare.h和.m)、測試類(settingmanager.h和.m)見下圖:

其中介面檔案testdanlishare.h沒有宣告任何介面,自定義類settingmanager.h宣告了三個方法:如下

@inte***ce testdanlishare : nsobject

@end

@inte***ce settingmanager : nsobject

+ (id)createsettingmanager;

- (nsstring *)settingmanagertitle;

- (void)titleinsettingmanager:(nsstring *)tile;

@end

這裡要強調的是

testdanlishare.h檔案沒有宣告介面,那麼按理論來說不能訪問.a檔案內的內容。

一下在貼出settingmanager的實現檔案

@inte***ce settingmanager ()

@property (strong, nonatomic) nsstring* title;

@end

@implementation settingmanager

//建立

+ (id)createsettingmanager

return nil;

}- (id)init

//輸出到外部

- (nsstring *)settingmanagertitle

//外部輸入

- (void)titleinsettingmanager:(nsstring *)tile

@end

//然後再建立乙個demo用來呼叫.a靜態庫。拷貝.a檔案,testdanlishare.h檔案和settingmanager.h檔案(這裡要注意必須拷貝settingmanager.h檔案)

//以下是呼叫:

- (void)buttonaction:(id)sender

結果列印如下:

從結果來看可以訪問未開放的類的。

2. 上面的例子也許有人會說,你這是用了單例,有可能單例的緣故。好吧,我就換一種方式:

去掉+ (id)createsettingmanager函式及其實現。

以下是呼叫:

- (void)buttonaction:(id)sender

結果列印如下:

從結果來看也是可以訪問未開放的類的。

總結:ios 的靜態庫只要是能提供標頭檔案且標頭檔案中包含對應函式(1.函式必須是public,2.類的建立和銷毀也要開放在標頭檔案中),靜態庫的呼叫程式都是可以訪問的。

ios的靜態庫中的未開放的類內呼叫的本質就是:靜態庫預編譯的。

更好的理解是:靜態庫工程加入到呼叫程式的工程裡面。

深入理解靜態鏈結的過程

靜態鏈結的過程 各個檔案之間都是單獨編譯的。編譯生成可重定位目標檔案後,目標檔案格 式也是elf可執行檔案格式但是並不能執行 根本原因是在編譯的時候目標檔案並沒有分配虛擬位址 原因如下 如果是定義在本檔案的函式和變數編譯器可以為它分配位址,但是如果當前的原始檔引用其他檔案的函式或者是全域性變數,這個...

C 中靜態的深入理解

一 靜態成員 1 通過static關鍵字修飾,是屬於類,例項成員屬於物件,在這個類第一次載入的時候,這個類下面的所有靜態成員會被載入。2 靜態成員只被建立一次,所以靜態成員只有乙份,例項成員有多少個物件,就有多少份。3 類載入的時候,所有的靜態成員就會被建立在 靜態儲存區 裡面,一旦建立直到程式退出...

深入理解PHP原理之靜態變數

通常意義上靜態變數是靜態分配的,他們的生命週期和程式的生命週期一樣,只有在程式退出時才結束期生命週期,這和區域性變數相反。靜態變數的型別可以分為靜態全域性變數 靜態區域性變 靜態成員變數,最常見的是靜態區域性變數及靜態成員變數,先看看如下區域性變數的使用 function t t t t 上述的程式...