Hello, World! by Objective-C + Foundation Framework

Objective-C + Foundation Framework な Hello, World! を作る.

GC 使わない場合

#import <Foundation/NSString.h>
#import <Foundation/NSAutoreleasePool.h>
#import <stdio.h>

int main(int argc, char **argv) {
    NSAutorelesePool* pool = [[NSAutoreleasePool alloc] init];

    NSString* str = [[NSString alloc] initWithString:@"こんにちは,世界!\n"];
    const char* cstr = [str UTF8String];

    printf("%s", cstr);

    [pool release];

    return 0;
}


NSAutoreleasePool は Foundation を使う上でメモリ管理用に必要なもの.

これがないと,NSString の中で autorelease か release か何かが呼ばれるらしいので実行時におこられちゃう.

    NSAutorelesePool* pool = [[NSAutoreleasePool alloc] init];

NSString を直接標準出力するものはないみたいなので,いったん C 言語の文字列に変換する必要がある.
ここでは,UTF-8 なマルチ バイト文字列に変換してる.

    const char* cstr = [str UTF8String];

NSString は wchar_t みたいなワイド文字列に変換する方法はないみたい.

コンパイルと実行はこんな感じ.

% gcc -framework Foundation test.m 
% a.out    
こんにちは,世界!

GC 使う場合

GC を使う場合は NSAutorelesePool はいらないみたい.

#import <Foundation/NSString.h>
#import <stdio.h>

int main() {
    NSString* str = [[NSString alloc] initWithString:@"こんにちは,世界!\n"];
    const char* cstr;
    cstr = [str UTF8String];

    printf("%s", cstr);

    return 0;
}

コンパイルに -fobjc-gc-fobjc-gc-only が必要になる.

% gcc -fobjc-gc -framework Foundation test.m 
% a.out    
こんにちは,世界!

とりあえずこれで Objective-C で Hello, World! をかけるようになったぞ!