0

私はちょうどこの行を書いた:

BOOL directoryResult = [[NSFileManager alloc]
createDirectoryAtURL:[[NSURL alloc]
initFileURLWithPath:[self.documentsPath
stringByAppendingFormat:@"/level%d", levelCount] isDirectory:YES]
withIntermediateDirectories:NO attributes:nil error:nil];
NSLog(@"BOOL: %d", directoryResult);

2 つの質問があります。この方法が適切に機能している可能性はどのようにあるのでしょうか。[NSFileManager alloc]私が使用していない後init

コンパイラが文句を言わないのはなぜですか? init は内部にありcreateDirectoryAtURLますか? プログラミングの良い方法ですか?

そして第二に、ちょうどその場でcreateDirectoryAtURL作成しているの URL パラメータでNSURL

[[NSURL alloc] initFileURLWithPath:[self.documentsPath stringByAppendingFormat:@"/level%d", levelCount] isDirectory:YES]

上記と同じ質問:プログラミングの良い方法ですか、それともその行の前にそのようなオブジェクトを作成して、ここにオブジェクトを配置する必要がありますか?

4

2 に答える 2

1

[NSFileManager defaultManager]ファイルマネージャーのシングルトンインスタンスを返し、それを使用してタスクを実行します。ココではよくあることです。コードが正しく動作する理由がわかりません。この特定のメソッドは内部変数を使用していないため、init なしで呼び出しても有効であると推測できます (ただし、これを行うべきではありません)。

NSURL構築に関しては、答えはコンパイルオプションによって異なります。ARCを使用していますか?答えが「はい」の場合、コードは有効ですが、そうでない場合はメモリ リークが発生します。autorelease一般的には、オブジェクトを作成して(ARC 以外のアプリを) 明示的に呼び出すか、 のようなクラス メソッドを使用することをお勧めします[NSURL fileURLWithPath:path]

また、それを侮辱として扱わないでください。ただし、この質問を間違った場所で行っていると思います。メモリ管理の基本的な質問は、Aaron Hillegass 著の「Mac OS X の Cocoa プログラミング」のような良書を参照する必要があります。

于 2013-02-26T12:14:46.560 に答える
0

初期化せずに作成されたオブジェクトが正しく動作することは保証されていません。したがって、オブジェクトを初期化する必要があります。ドキュメントの例:

BOOL isDir=NO;
NSArray *subpaths;
NSString *fontPath = @"/System/Library/Fonts";
NSFileManager *fileManager = [[NSFileManager alloc] init];
if ([fileManager fileExistsAtPath:fontPath isDirectory:&isDir] && isDir)
    subpaths = [fileManager subpathsAtPath:fontPath];
[fileManager release];

また、NSFileManagerには共有マネージャーがあります(作成済みで初期化済みのオブジェクト)

NSFileManager* fileManager = [NSFileManager defaultManager];

しかし、ドキュメントには警告があります:

このメソッドは、常に同じファイル マネージャー オブジェクトを返します。ファイルマネージャーでデリゲートを使用して、ファイルベースの操作の完了に関する通知を受け取る予定の場合は、共有オブジェクトを使用するのではなく、(init メソッドを使用して) NSFileManager の新しいインスタンスを作成する必要があります。

于 2013-02-26T12:17:16.480 に答える