iOS開發:相對路徑與相對工程名

江湖hi客發表於2016-08-02

一、絕對路徑與相對路徑1

iOS程式有固定的檔案訪問限制,只能在自己的沙盒內。

UIImage *img=[UIImage imageNamed:@"cellicon.png"];

這段程式碼從相對路徑載入了一個png圖片資源作為UIImage物件,沒有任何問題。因為它在內部已經偷偷得幫你把路徑轉化為相對路徑了,你還不知道吧!

接下來,如果要載入一些自定義格式的檔案或者資料,就會出現相對路徑和絕對路徑的問題。比如

//newPath為一個字串路徑,這裡的路徑你卻不能像上面那樣
  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];

//這樣系統是找不到檔案的,因為這裡需要的是檔案的絕對路徑,而@“test.txt”完全是無效的。
  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:@"test.txt"];

這個時候就需要NSBundle的幫忙了,這個類專門用來負責路徑轉化等等功能。大家都知道ios專案雖然在xcode下可以建立資料夾結構,但是實際上它是沒有檔案結構概念的,所以此時假如要載入放在專案目錄下的test.txt檔案,完整的程式碼應該是這樣

//方法1:
  NSString *newPath=[NSString stringWithFormat:@"%@%@%@",[[NSBundlemainBundle]resourcePath],@"/",path];
  NSLog(@"url=%@",newPath);
  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];

此處[NSBundle mainBundle]是獲得NSBundle的一個單例物件,此單例物件 已經設定了預設的resourcePath,也就是你的app打包後的路徑,[NSBundle mainBundle] resourcePath]就是獲得這個完整的打包後的app路徑,但你的test.txt檔案並不在這個目錄,而是在app內部,這時就需要拼接路徑字串,[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle] resourcePath],@"/",path];

控制檯輸出app路徑resourcePath:

/Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app

控制檯輸出拼接後完整檔案絕對路徑:

/Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app/test.jat

//方法2:
NSString *newPath=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];

[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jat"];pathForResource方法有兩個引數,前面這個為檔名,後面那個ofType就是檔案型別,也就是檔案字尾。這裡把檔名和字尾分開了,如果這時你得到的是一個完整的檔名如:@“test.txt”,那麼你得自己想辦法把檔名和字尾分開。要特別說明,此處的檔案字尾是不需要“.”的,如果寫成@“.jat”是錯誤的,載入檔案會失敗。

二、絕對路徑與相對路徑2

另外一處我們用到絕對路徑與相對路徑的地方就是我們在xcode裡面配置包含工程目錄下標頭檔案的時候,都要關聯著相對路徑和絕對路徑,如果只是自己用這個專案,用絕對路徑的問題不大。
如果你把工程發給別人,別人就要修改這個絕對路徑,這時候絕對路徑的缺點立馬出現。


1、所以在修改 Header Search Paths這個選項的時候使用
"$(SRCROOT)/當前工程名字/需要包含標頭檔案所在資料夾"
將上面的雙引號裡面的字串拷貝之後,你會發現這個“$(SRCROOT)”,會自動變成當前工程所在的資料夾。
這樣就可以了,發給別人,別人也不用在去修改路徑了。


2、設定PCH的相對路徑
絕對路徑:

要想設定PCH的相對路徑,首先我們需要去檢視絕對路徑。

點選PCH檔案,Xcode的右側會顯示PCH的屬性。這裡我們可以獲取到PCH的絕對路徑。

設定相對路徑:

從工程的路徑開始,前面使用$(SRCROOT)代替,即為PCH的相對路徑。

在Xcode的target配置中,在Build Setting中找到Prefix Header,將修改後得到的相對路徑新增到其中,並將Precompile Prefix Header的值設定為YES。

執行工程,PCH相對路徑設定成功。

三、使用相對工程名

有可能會在填Prefix Header 即pch檔案的路徑那裡報錯,最近又學習到一種更好的方式:

$(SRCROOT)/$(PROJECT_NAME)/PrefixHeader.pch,

其中$(PROJECT_NAME)是相對工程名,比上面的方法更便捷.




相關文章