EXC_BAD_ACCESS, стандартная библиотека c "open" на iphone? - PullRequest
1 голос
/ 01 сентября 2011

Довольно простой вопрос,

независимо от того, что я делаю, приложение вылетает при попытке вызвать open (), ниже приведена часть кода, которая имеет отношение к делу. filename не является мусорным значением и содержит абсолютный путь к файлу. Это терпит неудачу на устройстве и симуляторе.

printf имени файла возвращает:

/ Пользователи / programmingstation7 / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Применения / E2BD16DB-FFBA-45D2-B425-96C981380B85 / Документы / issue2.zip

соответствующая обратная трассировка:

#0 0x002132dc in open () 

#1 0x000ddcec in -[ExternalZipInstaller
unzipTheFile] (self=0x68a8d60, _cmd=0x1483f3) at
ExternalZipInstaller.mm:261

Код:

#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

#ifndef O_BINARY
#define O_BINARY 0
#endif
- (void) unzipTheFile
{
    BOOL success = YES;
    const char* filename = [self.zipName UTF8String];
    open(filename, O_RDONLY | O_BINARY);

1 Ответ

2 голосов
/ 01 сентября 2011

Документация для метода UTF8String NSString содержит следующее примечание:

Возвращенная строка C автоматически освобождается так же, как возвращаемый объект будет освобожден;Вы должны скопировать строку C, если необходимо сохранить ее вне контекста автоматического выпуска, в котором создается строка C.

Я думаю, что вам нужно скопировать полученную строку в собственный буфер, а не простоуказывая на это.Сборщик мусора в ObjC может удалить вашу строку из-под вас.Попробуйте вместо этого:

const char filename[MAX_PATH];
strcpy(filename, [self.zipName UTF8String], MAX_PATH);
open(filename, O_RDONLY | O_BINARY);
...