Objective-C 基本構文の解説 【初級編 第2回】

この記事は2012年9月2日に書かれたものです。内容が古い可能性がありますのでご注意ください。


Objective-C 基本構文の解説 【初級編 第2回】

HelloWorldのコード解説
さて前回は動作するか確認しただけなので、今回は前回のソースコードを見て、基本的なつくりを見ていきましょう。

前回のソースコード

#import <objc/Object.h>

@interface TestClass:Object
    -(void)testMethod;
@end

@implementation TestClass
-(void)testMethod{
    printf("Hello World!!");
}
@end

int main(){
    id myobj = [TestClass alloc];
    [myobj testMethod];
    [myobj free];
    return 0;
}

#import

まず最初の「#import」ですが、これはプリプロセッサに対する命令であるディレクティブと呼ばれるものです。
プリプロセッサとは、ソースコードをコンパイルする前に行う準備的な処理のことです。
ここではヘッダーファイルを読み込んでいます。ヘッダーファイルとは、定数や変数、メソッドといったものを
宣言しておくファイルとなっており、Objective-Cで拡張された変数などを
使用するために「Object.h」を読み込んでいます。

C言語の経験がある方は、ヘッダーファイルの読み込みは「#include」の方がなじみがあるのではないでしょうか。
実際「#include」でも問題なく動きます。ただこの2つには若干違いがあります。
小さなプログラムでは意識することありませんが、大きなプログラムになるとヘッダーファイルの2重読みこみを
してしまうことがあります。
例えば以下のようにするとコンパイルエラーとなります。



この例の場合、最初の「a.h」の読み込みの時に「test.h」が展開されるので変数aが定義されます。
そのあとまた「test.h」を読み込むので再度、変数aが定義されることになりコンパイルエラーとなります。
これを避けるために通常のCでは「#ifdef~#endif」を使用することとなりますが、「import」の場合、
これを行わなくても回避できるようです。

@interface,@end

次にクラスの定義部分に関してで、コードの「@interface」と「@end」のところです。
今回のコードは1つのファイルにすべてのコードが書かれていますが、実際は実装部分と定義部分を
分けて作成します。そうすることで実装の隠ぺいが可能になります。そのプログラムを使用する側から
するとどんなメソッドと変数があるのかという定義さえわかっていれば使用することができますので、
その内部の実装方法までは公開しないでおきます。
そうすることで勝手に実装を書き換えることによって、他のプログラムへの影響がでることを防止することが
できます。
この考え方に基づいて定義部分を記述しているのが「@interface~@end」部分となります。

「@interface」の後には「クラス名:スーパクラス」を指定します。
すべてのクラスは「Object」クラスから継承されることになります。
特に継承したいクラスがあるわけでもないので、このクラスを指定しておきます。

次の行でtestMethodというものを定義していますが、頭に「-」がついています。これはインスタンスメソッドであることを
示しています。インスタンスメソッドとはこのクラスをインスタンス化しなければ使用できないメソッドのことです。
そしてこの部分だけを別ファイルにし、例えば「TestClass.h」とかにして分けます。

「@implementation~@end」の部分が実装部分となります。
「@implementation」の後にクラス名を指定します。そして宣言してあるメソッドの実装を記述していきます。
インターフェースで宣言したものは必ず実装しなければなりません。
「@implementation」以下が「TestClass.m」となる感じです。
ファイルを分けたときはこちらのほうで「TestClass.h」を読み込んでいなければなりません。

ここまでのまとめとして

  • ヘッダーファイルは「#import」で読み込む
  • クラスの定義と実装は別のファイルにし、定義の方は「クラス名.h」とし、実装部分は「クラス名.m」とする
  • 定義は「@interface クラス名:スーパクラス名」~「@end」の間で行う
  • 実装は「@implementation クラス名」~「@end」の間で行う

といったところになります。

  • このエントリーをはてなブックマークに追加

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP