2011-08-12 24 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()を行います。パスは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'を再割り当てすると、最初の5行(' if contactsToProcess == nil {...} ')は役に立たなくなります。 – Cyrille

+0

'fPath()'によって返されるパスは何ですか? – PeyloW

+0

これは、ドキュメントディレクトリへのパスを返します。NSString * PathforResources(NSString * filename) { \t NSString * leftpart = [ファイル名stringByDeletingPathExtension]; \t NSString * extension = [filename pathExtension]; \t戻り値[[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が既に存在する場合に期待どおりに動作します。それは具体的に適切なコンテンツを持つファイルを作成することができません(または全くそれを作成するために、私はnilポインタをアーカイブする正確な効果は何か分かりません)。ファイルが存在しないとき確かに、あなたに元のコードを実行した後:

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

contactsToProcessはnilになります。これは、その上のすべての連続操作が効果を持たず、nilポインタをアーカイブしていることを意味します。つまり、ファイルが存在しない場合、期待どおりに配列で作成されません。これはあなたのデバイスで起こることです。

私の仮説は、シミュレータ上の別の状態でプログラムを実行し、配列がファイルに正常にアーカイブされたということです。次に、プログラムを現在の状態に変更しました。シミュレータ上でファイルが存在し、アーカイブされた配列を含んでいるため、ファイルは動作し続けます。デバイス上でファイルが作成されていないか、または単にnilが含まれているため、期待通りに機能しません。

アプリをアプリから削除することをお勧めします(ダッシュボード編集モードに入るまでアプリアイコンをタップし、削除ボタンをタップします)。上記で提案した変更を適用して再実行します。

+0

デバイス上でファイルを正しく作成するにはどうすればよいですか?私は起動時にファイルがDocuments direcoryに存在するかどうかチェックします。存在しなければ、コピーされます...奇妙なことです...ありがとう... –

+0

これは内容に依存する可能性があります。 'nil'をアーカイブすると、' nil'が得られます。私はデバイスからアプリを削除することをお勧めします(アプリアイコンを長くタップしてから、削除ボタンをタップします)、上記の変更を適用して再実行します。 – sergio

+0

は機能していませんか?私の最後のコードバージョンを試してみませんか?私は少し変わった... – sergio

0

何?

シミュレータでは、ファイルシステム(少なくともログインしているMac OS Xユーザーがアクセスできる限り)にアクセスできます。デバイス上では、サンドボックス化されたホームディレクトリのみです。

また、デバイスファイルシステムでは大文字と小文字が区別されるため、大文字と小文字は区別されません。Mac OS Xはデフォルトではありません。

+0

サンドボックスにアクセスする方法は?上記のアップデートを確認してください –

+0

サンドボックスはデバイス上のホームディレクトリなので、 '〜/'は良い出発点です。 – PeyloW

+0

ファイルパスはどうすればいいですか? –

関連する問題