inohilog

/var/log/inohiro.log

久しぶりにObjective-C(久しぶりにWeb+DB Pressを買った)

久しぶりにWeb+DB Pressを買いました。今年の春くらいまでは人が買ったのをちょっと見せてもらったり、とかだったのですが、電車での移動中に読むかなと思って。47号。
// 山本陽平さん記事だけまとめて読みたい。


Objective-C の導入記事があって、一番最初に読みました(詳説Objective-Cは1ヶ月くらい前に買ったのですが、あんまり読めてない)。


これまではTerminal + Emacs でちょっと書いては「あー動いた」みたいな感じだったんですが、今回初めてXCodeを使ってコードを書いてみました。といってもCommand Line Utilityなので、Terminal + Emacsでできる事変わらないんですが。
エラー表示とかがかっこいい(VSも見習うべき*1)。

コード

コードは、Web+DB Pressにあった日付を表示するものです。

#import <Foundation/Foundation.h>

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

	NSDate *today = [[[ NSDate alloc ] init ] autorelease ];
	NSDateFormatter *formatter = [[ NSDateFormatter alloc ] init ];
	[ formatter setDateStyle:NSDateFormatterMediumStyle ];
	NSString *formattedDate = [ formatter stringFromDate:today ];
	[ formatter release ];

    // insert code here...
    NSLog( @"Today is %@", formattedDate );

    [pool drain];
    return 0;
}

カギ括弧の中で、スペースあけるのはやっぱり好きじゃないな(個人の書き方の問題です。今回はたまたまそうやって書いてみただけ)。
「[formatter release]; -> [ formatter release ];」。

実行結果

inohiro-mac:~ inohiro$ /Users/inohiro/Projects/Obj-C/Date/build/Release/Date ; exit;
2008-11-29 11:23:52.465 Date[689:10b] Today is 2008/11/29

その他

Array にObject(文字列)を追加。

動的型付けだよーみたいな。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	
	NSMutableArray *array = [NSMutableArray array];
	[array addObject:@"Apple"];
	[array addObject:@"Orange"];
	[array addObject:@"Grape"];
	
	for( NSString *value in array )
	{
		NSLog( @"Value = %@", value );
	}

    [pool drain];
    return 0;
}
実行結果
inohiro-mac:~ inohiro$ /Users/inohiro/Projects/Obj-C/Array/build/Release/Array ; exit;
2008-11-29 12:16:40.256 Array[1235:10b] Value = Apple
2008-11-29 12:16:40.257 Array[1235:10b] Value = Orange
2008-11-29 12:16:40.258 Array[1235:10b] Value = Grape

クラスの実装

「[macintosh SayHello](macintosh オブジェクトのSayHelloメソッドを呼ぶ、というか、macintoshオブジェクトにSayHello(Helloって言え!))」とかわかりやすいと思う。

コード
#import <Foundation/Foundation.h>

// Interface
@interface Person : NSObject
{
	NSString *name;
}

- ( void ) SayHello;

@property ( nonatomic, copy ) NSString *name;

@end

// Implementation
@implementation Person

@synthesize name;

- ( void ) SayHello
{
	NSLog( @"Hi, I'am %@", name );
}

- ( void ) dealloc
{
	name = nil;
	[super dealloc];
}

@end

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

	Person *macintosh = [[[Person alloc] init] autorelease];
	macintosh.name = @"Macintosh";
	[macintosh SayHello];
	
    [pool drain];
    return 0;
}
結果
inohiro-mac:~ inohiro$ /Users/inohiro/Projects/Obj-C/Class/build/Release/Class ; exit;
2008-11-29 12:27:31.248 Class[1533:10b] Hi, I'am Macintosh

*1:アドインとかでありそうだけど