Строка в строку EXC_BAD_ACCESS почему? - PullRequest
0 голосов
/ 28 июля 2011

что я пропустил?

NSString * configPath = nil;
-(IBAction)setPlistPathAndWriteData:(id)sender{   
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    [panel setDirectory:@"/Volumes/"];
    [panel setNameFieldStringValue:@"config.plist"];
    [panel setRequiredFileType:@"plist"];
    NSInteger ret = [panel runModal];

    if ( ret == NSFileHandlingPanelOKButton ) {
        NSString *filePath= [[panel URL] path];
        // with this works fine
        //configPath = [NSString stringWithFormat:@"/Volumes/Macintosh HD/config.plist"];
        // with this EXC BAD ACCESS
        configPath = [NSString stringWithFormat:@"%@", filePath];
        [self writeData];
    }
}

-(void)writeData {
    SET_TEMP_PLIST
    NSTask *task = [[NSTask alloc] init];
    NSPipe *pipe = [[NSPipe alloc] init];
    NSFileHandle *writeHandle = [pipe fileHandleForWriting];
    NSData *configData = [NSPropertyListSerialization dataFromPropertyList:tmpPlist format:
                            NSPropertyListXMLFormat_v1_0 errorDescription:nil];
    [task setLaunchPath:@"/usr/libexec/authopen"];
    ////////////////////////////////////////////////////////EXC_BAD_ACCESS HERE////////
    [task setArguments:[NSArray arrayWithObjects:@"-c", @"-w", configPath, nil]];
    [task setStandardInput:pipe];
    [writeHandle writeData:configData];
    [task launch];
    close([writeHandle fileDescriptor]);
    [task waitUntilExit];
    [task release];
}

РЕДАКТИРОВАТЬ

хорошо ... отлично работает с этим кодом:

NSString *filePath= [[[panel URL] path] retain];
const char * cString = [filePath UTF8String];
configPath = [[NSString stringWithUTF8String:cString] retain];

но этоне идеальный метод .. мысль

1 Ответ

1 голос
/ 28 июля 2011

Ваше приложение, вероятно, аварийно завершает работу, потому что configPath равно nil, а позже в writeData вы пытаетесь инициализировать новый массив с nil в качестве третьего объекта:

[NSArray arrayWithObjects:@"-c", @"-w", configPath, nil]
//                                          ^^^ this is nil

Я предлагаю вам скопировать строку, возвращенную path:

if(ret == NSFileHandlingPanelOKButton ) {
    // you become the owner of the string,
    // don't forget to release configPath later
    configPath = [[[panel URL] path] copy];
    [self writeData];
}

Это может работать без проблем.

...