2014-09-23 85 views
3

也許我只是錯過了文檔中的東西,但我無法找到任何東西,說這種行爲應該在iOS版已經改變8.的NSFileManager -createFileAtPath失敗NSInvalidArgumentException

我的應用程序設置當前工作目錄Documents目錄,然後嘗試使用NSFileManager -createFileAtPath在那裏創建文件。在iOS 8之前,這工作正常。在運行iOS 8的設備,我得到的電話會議後,以-createFileAtPath:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -[NSFileManager fileSystemRepresentationWithPath:]: nil or empty path argument' 


下面是一個最小的代碼片段重現問題:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [paths objectAtIndex:0]; 
[[NSFileManager defaultManager] changeCurrentDirectoryPath:docsDir]; 
[[NSFileManager defaultManager] createFileAtPath:@"temp.dat" contents:nil attributes:nil]; 

註上createFileAtPath路徑參數是"temp.dat" -如果我將其更改爲"./temp.dat",則調用成功。

我在做一些愚蠢的事情,這只是「意外」在以前的iOS版本中工作?還是他們故意改變這裏的行爲?或者這是iOS 8中的一個錯誤?採用path參數的其他NSFileManager方法似乎只需一個文件名即可(例如-removeItemAtPath:@"temp.dat" error:&err成功)。

編輯補充:

這只是發生在物理設備上。在模擬器中,上述createFileAtPath的調用成功。

+0

'createFileAtPath'應該傳遞一個完整的路徑名。將'temp.dat'附加到'docsDir'並將其傳入。不需要更改當前目錄。 – rmaddy 2014-09-23 17:50:56

+0

@rmaddy:我想我的觀點是,它在iOS 8之前的所有版本中都能正常工作(這是iOS 3以後的應用程序),我在文檔中找不到的東西表明它應該改變。 「temp.dat」是一個相對路徑(與「./temp.dat」相同) - 文檔沒有指定它必須是絕對路徑,其他NSFileManager方法接受相同的相對路徑(有或沒有。 /) 正好。我傾向於將它稱爲一個錯誤(無論是在操作系統還是在文檔中)並向Apple發送錯誤報告。 – 2014-09-23 18:14:05

+0

在iOS8發行說明中有一個簡短的提及:「應用程序容器的文件系統佈局在磁盤上已更改,而不是依賴硬編碼的目錄結構,請使用NSSearchPathForDirectoriesInDomains函數或URLForDirectory:inDomain:appropriateForURL:create:錯誤:NSFileManager類的方法。「但是,這並不能解釋你的錯誤... – Gismay 2014-09-23 18:25:28

回答

5

我打開了一個蘋果的錯誤,他們把它作爲一個副本關閉。雖然這並不一定證實他們認爲它是一個bug,但它至少證實我不是第一個遇到這個問題的人,而且這種行爲確實在iOS 8中發生了變化。

現在,解決方案是將./預先加入文件名,或提供絕對路徑。

+0

你一定在開玩笑吧。我的應用程序商店應用程序現在已經運行了6個月,現在因此開始崩潰。蘋果的警告在哪裏? – Jacksonkr 2015-02-15 17:46:51