Objective-C 入門(1) 他の言語と比較して `hello, world'
Mac 使いとして、Objective-C の一つや二つ使えないのは悲しいので(Cocoaが使えない!)勉強してみることにしました。
初心者の観点でしかかけませんが、何かお気づきの点はアドバイス頂ければ幸いです。
他の言語と比較して `hello, world'
まずは処理系のインストール
Mac な人はそのまま何も考えずにプログラミングに入れます ;-)Linux な人は、処理系をインストールしてみましょう。
とりえあず、Debian GNU/Linux 4.0(etch) では apt-get を使って Objective-C 対応の gcc (gobjc) と、フレームワーク(GNUstep) をインストールすることができます。
% sudo apt-get install build-essential gobjc libgnustep-base-dev gnustep-devel
C++ で `hello, world'
main.cpp
#include#include "Hello.h"
int
main(int argc, char *argv[])
{
using std::cout;
using std::endl;CHello *hello;
hello = new CHello("hello, world");
cout << *hello->getMessage() << endl;
delete hello;
return (0);
}
Hello.h
#ifndef HELLO_H_
#define HELLO_H_#include
using std::string;
class CHello {
private:
string * m_message;public:
CHello(const char *message_);
virtual ~CHello();string *getMessage(void);
};
#endif /*HELLO_H_*/
Hello.cpp
#include "Hello.h"using std::string;
CHello::CHello(const char *message_)
{
m_message = new string(message_);
}CHello::~CHello()
{
delete m_message;
}string *
CHello::getMessage()
{
return (m_message);
}
Makefile
CC = g++
CPPFLAGS= -Wall -g
LDFLAGS =LD = g++
HELLO = hello
SRCS = main.cpp Hello.cpp
HEADS = $(SRCS:.cpp=.h)
OBJS = $(SRCS:.cpp=.o)all: $(HELLO)
clean:
$(RM) $(RMFLAGS) $(OBJS) $(HELLO)$(HELLO): $(OBJS)
$(CC) $(LDFLAGS) -o $(HELLO) $(OBJS).SUFFIXES:.o .cpp
.cpp.o:
$(CC) -c $(CPPFLAGS) $<
コンパイルと実行
% make
g++ -c -Wall -g main.cpp
g++ -c -Wall -g Hello.cpp
g++ -o hello main.o Hello.o
% ./hello
hello, world
Objective-C で `hello, world'
では、これを Objective-C で書いてみると・・・main.m
#import
#import#import "Hello.h"
int
main(int argc, char *argv[])
{
NSAutoreleasePool *pool;
id hello;pool = [[NSAutoreleasePool alloc] init];
hello = [[CHello alloc] init:"hello, world"];
printf("%s\n", [[hello getMessage] cStringUsingEncoding:NSUTF8StringEncoding]);
[hello dealloc];
return (0);
}
Hello.h
#ifndef HELLO_H_
#define HELLO_H_#import
#import@interface CHello :NSObject
{
@private
NSString *m_message;
}
- (id) init:(const char *) message_;
- (void) dealloc;- (NSString *) getMessage;
@end
#endif /*HELLO_H_*/
Hello.m
#import "Hello.h"@implementation CHello
- (id) init:(const char *) message_ {
m_message = [[NSString alloc] initWithCString:message_ encoding:NSUTF8StringEncoding];return (self);
}- (void) dealloc {
[m_message release];[super dealloc];
}- (NSString *) getMessage {
return (m_message);
}
@end
Makefile
CC = gcc
CFLAGS = -Wall -g -I/usr/include/GNUstep/Headers/
LDFLAGS = -lobjc -L/usr/lib/GNUstep/System/Library/Libraries/ -lgnustep-baseLD = gcc
HELLO = hello
SRCS = main.m Hello.m
HEADS = $(SRCS:.m=.h)
OBJS = $(SRCS:.m=.o)all: $(HELLO)
clean:
$(RM) $(RMFLAGS) $(OBJS) $(HELLO)$(HELLO): $(OBJS)
$(CC) $(LDFLAGS) -o $(HELLO) $(OBJS).SUFFIXES:.o .m
.m.o:
$(CC) -c $(CFLAGS) $<
コンパイルと実行
% make
gcc -c -Wall -g -I/usr/include/GNUstep/Headers/ main.m
gcc -c -Wall -g -I/usr/include/GNUstep/Headers/ Hello.m
gcc -lobjc -L/usr/lib/GNUstep/System/Library/Libraries/ -lgnustep-base -o hello main.o Hello.o
% ./hello
hello, world
めでたく同じ結果となりました!
次回はこの `hello, world' を OSX 上で動かしてみたいと思います