15

最初の起動時に、メイン バンドルの "Populator" フォルダーにある一連のファイルがドキュメント ディレクトリにコピーされるように、アプリケーションをセットアップしようとしています。

私の現在の実装は次のとおりです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Populator"];
  NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"Files"];
  NSLog(@"Source Path: %@\n Documents Path: %@ \n Folder Path: %@", sourcePath, documentsDirectory, folderPath);

  NSError *error;

  [[NSFileManager defaultManager] copyItemAtPath:sourcePath 
                                        toPath:folderPath
                                         error:&error];

  NSLog(@"Error description-%@ \n", [error localizedDescription]);
  NSLog(@"Error reason-%@", [error localizedFailureReason]);
  ....
  return YES;
}

ただし、これを初めて実行すると、次のコンソール メッセージが表示されてクラッシュします (ただし、ファイルはコピーされます)。次回アプリを開いたときに、クラッシュしません。

    2010-07-13 15:14:26.418 AppName[5201:207] Source Path: /Users/jack/Library/Application Support/iPhone Simulator/3.2/Applications/1076C1FA-60B0-4AC7-8CD4-74F81472DAE6/AppName.app/Populator
 Documents Path: /Users/jack/Library/Application Support/iPhone Simulator/3.2/Applications/1076C1FA-60B0-4AC7-8CD4-74F81472DAE6/Documents 
 Folder Path: /Users/jack/Library/Application Support/iPhone Simulator/3.2/Applications/1076C1FA-60B0-4AC7-8CD4-74F81472DAE6/Documents/Files
2010-07-13 15:14:26.466 AppName[5201:207] *** +[AppNameAppDelegate localizedDescription]: unrecognized selector sent to class 0xa79c
2010-07-13 15:14:26.475 AppName[5201:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[AppNameAppDelegate localizedDescription]: unrecognized selector sent to class 0xa79c'
2010-07-13 15:14:26.495 AppName[5201:207] Stack: (
    40911435,
    2569270537,
    41183227,
    40645910,
    40642578,
    9142,
    2815466,
    2819475,
    2844680,
    2826401,
    2858055,
    49271164,
    40452156,
    40448072,
    2817668,
    2850273,
    8776,
    8630
)

何がうまくいかないかについて誰か提案がありますか? 「初回起動時のみ」機能を実装するコードを既にいくつか設定していますが、わかりやすくするためにここには含めていません。

ありがとう

4

6 に答える 6

15
于 2010-07-13T14:30:05.290 に答える
5

コードを読んだだけで、問題が見つかりました。上で Sean Edwards が指摘しているように、成功してもエラーは発生しないため、クラッシュします。

興味のある人のための私の新しいコードは次のとおりです。

if([[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:folderPath error:&error]){
    NSLog(@"File successfully copied");
} else {
    NSLog(@"Error description-%@ \n", [error localizedDescription]);
    NSLog(@"Error reason-%@", [error localizedFailureReason]);
}
于 2010-07-13T14:29:53.683 に答える
4

私は iPhone プログラミングや Objective C についてあまり詳しくありませんが、好奇心から、コピー操作が実際に成功した場合、その場合のエラーは何ですか? エラーがなかった場合、クラッシュしているのはログ行でしょうか?

[編集] また、そのようなサブディレクトリの内容全体をコピーすることは許可されていますか? (繰り返しますが、私は iOS API に慣れていません。他の言語/API について知っていることに基づいて、考えられるエラーの原因を特定しているだけです)

于 2010-07-13T14:28:45.057 に答える
2

You log an error before you know that there is an error

put the code in an if-block

if(error)
{
 NSLog(@"Error description-%@ \n", [error localizedDescription]);
 NSLog(@"Error reason-%@", [error localizedFailureReason]);
}

To describe your problem in more detail: the pointer of error points ANYWHERE and that object does not recognize that message. Therefore you get an exception

于 2010-07-13T14:32:02.277 に答える
1

一般的なプログラミング手法として、変数をデフォルト値で初期化するのが常に最善です。

NSError *error = nil;

Objective-Cでは、にメッセージを送信することが有効ですnil。したがって、あなたの場合、エラー変数がに初期化されていれば、エラー変数はクラッシュを引き起こしませんnil

Sending Messages to nilサブジェクトチェックセクションの詳細については、 https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.htmlをご覧ください。

于 2012-06-07T12:08:33.163 に答える