一直以為做靜態庫就是為了更好的封裝(開放該開放的介面,遮蔽一些內部實現細節)。直接的理解就是介面標頭檔案(.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 上述的程式...