深入理解iPhone靜態庫(手把手教你iphone開發 - 基礎篇)

來源:互聯網
上載者:User

作者:孫東風 2009-11-20(請尊重作者勞動成果,轉載務必註明出處)

 

在實際的編程過程中,通常會把一些公用函數製成函數庫,供其它程式使用,一則提搞了代碼的複用;二則提搞了核心技術的保密程度。所以在實際的項目開發中,經常會使用到函數庫,函數庫分為靜態庫和動態庫兩種。和多數人所熟悉的動態語言和靜態語言一樣,這裡的所謂靜態和動態是相對編譯期和運行期的:靜態庫在程式編譯時間會被連結到目標代碼中,程式運行時將不再需要改靜態庫;而動態庫在程式編譯時間並不會被連結到目標代碼中,只是在程式運行時才被載入,因為在程式運行期間還需要動態庫的存在。

 

iPhone官方只支援靜態庫聯編,本文就以靜態庫為例講解iPhone中靜態庫的具體用法。在實際的開發過程中,可能在項目設計階段把一些功能比形介面引擎、網路通訊引擎等都規划到相應的函數庫中。

 

開啟XCode建立一個項目,選擇Library下的“Cocoa Touch Static Library”並命名為“FirstLibrary”。這個建立的靜態庫項目下除了“FisrtLibrary_Prefix.pch”外沒有任何程式檔案,在Classes檔案夾上點右鍵選擇“New File…”,然後在“Cocoa Touch Class”下選擇“Objective-C class”,筆者在這裡先建立Objective-C風格的源檔案和標頭檔並命名為“function”,可以看到在Classes目錄下產生了function.h和function.m檔案。接著在標頭檔裡輸入以下內容:

 

#import <Foundation/Foundation.h>

@interface function : NSObject {

}

- (int)getMax:(int)a b:(int)b;

- (int)getMin:(int)a b:(int)b;

@end

 

實現檔案function.m內容如下:

 

#import "function.h"

@implementation function

- (int)getMax:(int)a b:(int)b

{

    return a > a?a:b;

}

 

- (int)getMin:(int)a b:(int)b

{

    return a < b?a:b;

}

@end

 

可見,筆者的這個靜態函數庫的功能很簡單,就是提供了兩個擷取最大值和最小值的函數。但是可能大多數現存的函數庫的源碼都是C或者C++格式的,沒關係,iPhone對C/C++支援的也很好。在Classes檔案夾上點右鍵,選擇“New File…”,這次選擇Mac OS X下的“C and C++”,之後選擇“C File”並命名為“TestCFunction”,可以看到在Classes目錄下產生了兩個檔案“TestCFunction.h”和“TestCFunction.c”,TestCFunction.h如下:

 

#ifndef TestCFunction_H_

#define TestCFunction_H_

 

void swapValue(int* a,int* b)

{

    int temp = 0;

    temp = *a;

    *a = *b;

    *b = temp;

}

 

#endif

 

TestCFunction.c檔案內保持為原樣。

 

至此,這個靜態函數庫已經編寫完畢,儘管很簡單,但是包含了Objective-C風格和C風格的原始碼檔案在內,編譯這個程式會看到在Products目錄下產生了名為“libFirstLibrary.a”的靜態庫檔案。

 

建立一個“Window-based Application”項目並命名為“FirstLibraryTest”,下面筆者會示範如何在這個新項目裡利用前面產生的靜態庫libFristLibrary.a檔案。

 

¨         首先,拖拉靜態庫裡的“FirstLibrary.xcodeproj”檔案到新項目的Frameworks目錄下(當然也可以通過右鍵點Frameworks->Add->Existing Files..添加),如:

 

圖1

 

¨         然後選擇“FristLibrary.xcodeproj”檔案,選擇右邊編輯視窗中的最後一項,這樣就將靜態庫添加到項目中了,如:

 

圖2

 

¨         在將靜態庫添加到項目中後,需要在項目和靜態庫之間建立“Direct Dependencies(所謂的依賴關係)”。在“Targets”目錄下選擇“FirstLibraryTest”,然後快速鍵Cmd+i(或者右鍵選擇Get Info)可以看到項目的依賴資訊,如:

 

圖3

 

點擊“Direct Dependencies”下方的“+”按鈕,會出現:

 


圖4

選擇“FirstLibrary”並點擊“Add Target”,這樣就建立了項目和靜態庫之間的“依賴關係”,在項目編譯階段,程式會到靜態庫中尋找相應的目標檔案。

 

¨         接下來使用靜態庫中的函數,修改標頭檔FirstLibraryTestAppDelegate.h如下:

 

#import <UIKit/UIKit.h>

#import "function.h"

#include "TestCFunction.h"

 

@interface FirstLibraryTestAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;

    function* iFunc;

}

 

@property (nonatomic, retain) IBOutlet UIWindow *window;

 

@end

 

修改相應的實現檔案如下:

 

#import "FirstLibraryTestAppDelegate.h"

 

@implementation FirstLibraryTestAppDelegate

@synthesize window;

 

- (void)applicationDidFinishLaunching:(UIApplication *)application {   

 

    iFunc = [[function alloc] init];

    int a = 3,b = 6;

    int max = 0,min = 0;

    max = [iFunc getMax:a b:b];

    min = [iFunc getMin:a b:b];

   

    NSLog(@"max = %d,min = %d",max,min);

   

    int c = 8,d = 22;

    swapValue(&c, &d);

   

    NSLog(@"after swapValue c = %d,d = %d",c,d);

   

    // Override point for customization after application launch

    [window makeKeyAndVisible];

}

 

 

- (void)dealloc {

    [window release];

    [super dealloc];

}

@end

 

編譯下,會發現項目無法編譯通過,錯誤資訊如下:

 

error: function.h: No such file or directory

 

就是說,項目無法找到相應的靜態庫的標頭檔,從而也就無法在項目和靜態庫之間建立“依賴關係”,所以需要在項目的“依賴資訊選項”裡告訴項目它所依賴的靜態庫標頭檔的位置資訊,如設定靜態庫標頭檔的位置資訊:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.