EXC_BAD_ACCESS для stringByAppendingPathComponent - PullRequest
1 голос
/ 16 сентября 2011

Я хочу, чтобы мое приложение скопировало видео, которое вы взяли с ним, в каталог внутри песочницы приложения.

Вот что я написал до сих пор.

- (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];

Что здесь может быть не так?

И, на самом деле, я хочу «создать» новый каталог с именем videos внутри изолированной программной среды приложения и сохранить его.Я не мог этого сделать, поэтому я использую каталог документов.

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Вы отправляете сообщение

isFileURL

NSString как-то, и это не распознанное сообщение для NSString.

Включите ведение журнала стека malloc, включите охрану malloc и зомби в отладчике, затем выполните:

(gdb) info malloc-history 0x1b18b0

Где 0x1b18b0 - адрес отправляемой вещи нераспознанным селектором. Это должно дать вам больше информации о том, где в вашем коде проблема.

1 голос
/ 16 сентября 2011

Проблема заключается в этой строке

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

Вместо фактического форматирования строки вы используете оператор запятой , который в конечном итоге устанавливает 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;

Чтобы исправить это, все, что вам нужно сделать, это отформатировать строку.И чтобы решить другую проблему, вам нужно создать URL для 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];
1 голос
/ 16 сентября 2011

Трассировка исключений показывает, что вы пытаетесь отправить isFileURL: метод в NSString, который не является допустимым методом в NSString. Я не вижу isFileURL: в коде, который вы опубликовали, проверьте свой код, чтобы увидеть, где вы можете это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...