2011-08-12 76 views
0

這是我的代碼..爲什麼它不會在設備上添加對象數組? 也許陣列不能從文件讀取?我將文件寫入文檔目錄,但可能會出錯?謝謝...在模擬器上工作,無法在iPhone設備上工作

if (contactsToProcess==nil) 
    { 
    contactsToProcess=[[NSMutableArray alloc] init]; 
    NSLog(@"Array with objs initialized"); 
    } 
    contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()]; 
    [contactsToProcess addObject:cont]; 
    NSLog(@"Object added to file:"); 
    for(Contact *cn in contactsToProcess) 
    { 
     NSLog(@"%@", cn.fName); 
    } 

     [NSKeyedArchiver archiveRootObject:contactsToProcess toFile:fPath()]; 

fPath()的作用:

NSString* PathforResources(NSString* filename) 
{ 
    NSString *leftpart=[filename stringByDeletingPathExtension]; 
    NSString *extension=[filename pathExtension]; 
    return [[NSBundle mainBundle] pathForResource:leftpart ofType:extension]; 

} 
NSString* DocumentsDirectory() 
{ 
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES); 
    return [paths objectAtIndex:0]; 

} 
NSString* fPath() 
{ 
    return [DocumentsDirectory() stringByAppendingPathComponent:@"quickdial.xml"]; 
} 
+1

前6行('如果contactsToProcess == nil {...}')無用,因爲您在第6行重新指定了「contactsToProcess」。 – Cyrille

+0

'fPath()'返回的路徑是什麼? – PeyloW

+0

它返回Documents目錄的路徑:NSString * PathforResources(NSString * filename) { \t NSString * leftpart = [filename stringByDeletingPathExtension]; \t NSString * extension = [filename pathExtension]; \t return [[NSBundle mainBundle] pathForResource:leftpart ofType:extension]; \t } 的NSString * DocumentsDirectory() { \t的NSArray *路徑= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDirectory,YES); \t return [paths objectAtIndex:0]; \t } 的NSString * fPath() { \t返回[DocumentsDirectory()stringByAppendingPathComponent:@ 「quickdial.xml」]; } –

回答

1

我想你應該改變你的代碼:

contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()]; 
if (contactsToProcess==nil) 
{ 
    contactsToProcess=[[NSMutableArray alloc] init]; 
    NSLog(@"Array with objs initialized"); 
} 
... 

那麼一切都應該工作。一些解釋:只要文件quickdial.xml已經存在,您發佈的代碼將只按預期工作;它將特別無法創建具有適當內容的文件(或者根本不能創建它,我不知道歸檔指針的確切效果是什麼)。事實上,當文件不存在,執行你原來的代碼之後:

if (contactsToProcess==nil) 
{ 
contactsToProcess=[[NSMutableArray alloc] init]; 
NSLog(@"Array with objs initialized"); 
} 
contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()]; 

contactsToProcess將是零;這意味着對它的所有後續操作都不起作用,並且您正在歸檔一個nil指針。即,當文件不存在時,它不會像您期望的那樣與數組一起創建。這是您的設備上發生的情況。

我的假設是,您在模擬器上以不同的狀態運行程序,並且您的數組已成功歸檔到文件中。然後您將程序更改爲當前狀態;在模擬器上它保持工作,因爲文件在那裏幷包含一個存檔數組。在設備上,該文件未被創建或只包含nil,因此它不像您期望的那樣工作。我建議從設備中刪除應用程序(點擊應用程序圖標,直到進入儀表板編輯模式,然後點擊刪除按鈕);然後應用我上面建議的更改並重新運行。

+0

如何在設備上正確創建文件?我有一個函數,在啓動時檢查文件是否存在文件direcory中的文件,如果它不存在,則將其複製......奇怪......以及..謝謝 –

+0

它可能取決於內容;如果你存檔'nil',你會得到'nil'。我會建議從設備中刪除應用程序(長時間點擊應用程序圖標,然後點擊刪除按鈕),應用我上面建議的更改並重新運行。 – sergio

+0

不是工作?你會嘗試我的最後一個代碼版本嗎?我改變了一點... – sergio

0

的路徑是什麼由fPath()返回?

在模擬器上,您只能訪問完整的文件系統(至少您登錄的Mac OS X用戶可以訪問),僅在設備上使用沙盒主目錄。

此外,由於設備文件系統區分大小寫,因此還要檢查不匹配的lower/UPPER情況,因此Mac OS X不是默認設置。

+0

如何進入沙箱?請檢查以上更新 –

+0

沙箱是設備上的主目錄,所以'〜/'是一個很好的起點。 – PeyloW

+0

不完全是...我應該怎麼寫filePath呢? –

相關問題