2014-01-20 3 views
2

У меня есть следующие Objective-C фрагмент кода в моей привет мир пример:Сегментация ошибка при attemping для печати NSString, как UTF8String

//hello.m 

#import <Foundation/Foundation.h> 
#import "hello.h" 

void sayHello() 
{ 
    #ifdef FRENCH 
    NSString *helloWorld = @"Bonjour Monde!\n"; 
    #else 
    NSString *helloWorld = @"Hello World\n"; 
    #endif 
    printf("%s", [helloWorld UTF8String]); 
} 


//main.m 
#import <Foundation/Foundation.h> 
#import "hello.h" 

int main (int argc, const char * argv[]) 
{ 
    sayHello(); 
    return 0; 
} 

строит этот материал на OSX работает отлично и работает, как ожидалось. Но при компиляции/связывании его с ubuntu (с использованием GNUStep) возникает ошибка сегментации при выполнении двоичного файла. Я прибил его к операции кастинга в инструкции printf, но я не знаю, что я делаю неправильно здесь или как я могу это решить.

Замечательное примечание: это прекрасно работает при использовании gcc toolchain для создания исполняемого файла. Я просто вижу эту проблему, создавая ее с clang на ubuntu.

Любая помощь очень ценится.

+0

литьем я имел в виду это заявление: «[Helloworld UTF8String]» –

+0

'[Helloworld UTF8String]' является вызов метода , а не литой. Пожалуйста, предоставьте остальную часть кода для контекста. То, что вы опубликовали, не будет компилироваться (нет функций/методов и т. Д.). – BergQuester

+1

UTF8String возвращает версию 'const char * 'NSString. Это существование привязано к времени жизни объекта NSString таким образом, который может быть легко удален, если среда управления хранением даже немного повреждена. –

ответ

1

Чтобы устранить эту проблему, я в конечном итоге изменить свой код на следующее:

... 
void sayHello() 
{ 
    #ifdef FRENCH 
    NSString *helloWorld = @"${HELLO_WORLD_FRENCH}\\n"; 
    #else 
    NSString *helloWorld = @"${HELLO_WORLD}\\n"; 
    #endif 

    NSFileHandle *stdout = [NSFileHandle fileHandleWithStandardOutput]; 
    NSData *strData = [helloWorld dataUsingEncoding: NSASCIIStringEncoding]; 
    [stdout writeData: strData]; 
} 
... 
Смежные вопросы