stringByAppendingPathComponent上的EXC_BAD_ACCESS

时间:2011-09-16 14:30:45

标签: objective-c

我希望我的应用程序将您用它拍摄的视频复制到App Sandbox内的目录。

这是我到目前为止所写的内容。

- (void) imagePickerController:(UIImagePickerController *)picker 
 didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    int r = arc4random() % 100;
    int s = arc4random() % 100;
    int e = arc4random() % 100;
    NSLog(@"%i%i%i.MOV", r, s, e);
    NSString *tempFileName = (@"%i%i%i.MOV", r, s, e);
    NSString *tempFilePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
    NSString *documentsDirectory 
        = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                               NSUserDomainMask, YES)
                                 objectAtIndex:0];
    NSString *storePath = [documentsDirectory stringByAppendingPathComponent:tempFileName];

    NSError *error = nil;
    [[NSFileManager defaultManager] copyItemAtURL:tempFilePath
                                            toURL:[NSURL fileURLWithPath:storePath]
                                            error:&error];

但是在我的iPhone上测试我的应用程序后,程序在拍摄视频后按下使用后卡住了。 xCode告诉

上的EXC_BAD_ACCESS
NSString * storePath = [documentsDirectory stringByAppendingPathComponent:tempFileName];

这里有什么不妥?

呃,我实际上想要在应用程序沙箱中“创建”一个名为视频的新目录并保存在其中。 我不能这样做,所以我使用的是文件目录。

谢谢!

3 个答案:

答案 0 :(得分:1)

异常跟踪显示您尝试将isFileURL:方法发送到NSString,而NSString不是NSString上的有效方法。我没有看到任何isFileURL:在你发布的代码中,检查你的代码,看看你可能在做什么。

答案 1 :(得分:1)

您正在发送消息

isFileURL
以某种方式到NSString并且它不是NSString的可识别消息。

在调试器中启用malloc堆栈日志记录,保护malloc和zombie,然后运行:

(gdb) info malloc-history 0x1b18b0

其中0x1b18b0是发送无法识别的选择器的东西的地址。它应该为您提供有关代码中问题所在位置的更多信息。

答案 2 :(得分:1)

问题在于这一行

NSString * tempFileName = (@"%i%i%i.MOV", r, s, e);

您使用comma operator而不是实际格式化字符串,而{{3}}最终将tempFileName设置为e中存储的随机数,这将是无效地址。该行等同于以下内容。

@"%i%i%i.MOV";
r;
s;
//Now here is where the pointer is set to an invalid address
//resulting in EXC_BAD_ACCESS
NSString * tempFileName = e;

要解决这个问题,您只需格式化字符串即可。要解决另一个问题,您需要像tempFilePath那样为storePath实际制作网址。

NSString * tempFileName = [NSString stringWithFormat:@"%i%i%i.MOV", r, s, e];

...

NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:tempFilePath]
                                        toURL:[NSURL fileURLWithPath:storePath]
                                        error:&error];