崩溃在[NSFileManager removeItemAtPath:error:]

时间:2011-11-21 08:49:46

标签: iphone objective-c cocoa-touch

我正在尝试使用以下代码从路径中删除文件。但是我的应用程序在从路径中删除文件时崩溃。

- (void)saveEditedSavedFile:(NSString*)editedfile As:(NSString*)originalFile
{
    [originalFile retain];
    NSArray* dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docsDir = [dirPaths objectAtIndex:0]; 

    NSError* error = nil;

    NSString *editedFilePath=[docsDir stringByAppendingPathComponent:editedfile];

    NSFileManager* fileMngr = [NSFileManager defaultManager];

    if([fileMngr fileExistsAtPath:originalFile])
    {
nslog(@"%@", originalFile); // nslog always prints the correct path even if it crashes..
        [fileMngr removeItemAtPath:originalFile error:NULL];
    }

    if ([fileMngr moveItemAtPath:editedFilePath toPath:originalFile error:&error] != YES)
    {
        UIAlertView* alertView1 = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Unable to Save File. Please Choose a Diffrent name." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alertView1 show];
        [alertView1 release];

    }

}

这里我试图用新文件替换已经存在的文件。(移动文件操作)但它在[fileMngr removeItemAtPath:originalFile error:NULL]崩溃;

我正在收到这样的调用堆栈。

#0  0x99f1dc5a in __kill ()
#1  0x99f1dc4c in kill$UNIX2003 ()
#2  0x99fb05a5 in raise ()
#3  0x99fc66e4 in abort ()
#4  0x99fb4e78 in szone_error ()
#5  0x99fb4fb3 in free_list_checksum_botch ()
#6  0x99ec7a88 in small_free_list_remove_ptr ()
#7  0x99ec45cc in szone_free_definite_size ()
#8  0x99ec35e8 in free ()
#9  0x99ee8adb in fts_close$INODE64 ()
#10 0x99f31b57 in __removefile_tree_walker ()
#11 0x99f31999 in removefile ()
#12 0x0006ed01 in -[NSFilesystemItemRemoveOperation main] ()
#13 0x0005cbd2 in -[__NSOperationInternal start] ()
#14 0x0006eaa2 in -[NSFileManager removeItemAtPath:error:] ()

任何人都可以告诉我为什么我的应用程序崩溃了吗?我检查那条道路是否正确。

2 个答案:

答案 0 :(得分:1)

最好的猜测是originalFile已经过度释放,并且在执行-removeItemAtPath:error:期间的某个时刻,其内存已被重新分配。尝试使用僵尸分析工具运行它。

答案 1 :(得分:0)

堆栈跟踪看起来NSFileManager中存在实现错误。

执行删除(嵌套)文件(remove file__removefile_tree_walker)的脏工作的函数使用BSD的“fts”工具(请参阅man fts)来遍历目录结构。在后一个函数中,FTS句柄被关闭但未打开。这绝对是实现中的一个错误。你应该file a radar

如何发生这是一个猜测的问题。我将查看文件系统上的并发操作的方向(在同一项上并行删除,在删除时移动部分层次结构,...)。