§1 クラスを使ってみる
前回と同様のコードを使ってクラスの使い方について説明したいと思います。
ヘッダファイル(TestClass.h)
1 2 3 4 5 6 7 8 9 10 |
#import <Foundation/Foundation.h> //クラス宣言部 @interface TestClass : NSObject{ NSString *myString; } - (void)setMyString :(NSString*)inputString; - (void)printString; @end |
クラスファイル(TestClass.m)
1 2 3 4 5 6 7 8 9 10 11 12 |
#import "TestClass.h" //クラス実装部 @implementation TestClass - (void)setMyString :(NSString*)inputString { myString = inputString; } - (void)printString { printf("myString is %s ", [myString UTF8String]); } @end |
メインファイル(main.m)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#import <Foundation/Foundation.h> #import "TestClass.h" int main(int argc, constchar *argv[]) { @autoreleasepool { // insert code here... id testClassObj; testClassObj = [[TestClass alloc] init]; [testClassObj setMyString:@"ABCDEFG"]; [testClassObj printString]; } return 0; } |
では、作成したTestClassを使ってみることにします。まずはインスタンスを作成します。インスタンスの作成は、クラスに用意されているメソッドを呼び出して行います。具体的には以下のようになります。
1 2 |
TestClass *testClassObj = [TestClass alloc]; testClassObj = [testClassObj init]; |
一行で書くと、
1 |
TestClass *testClassObj = [[TestClass alloc] init]; |
allocにてメモリ領域を確保してinitで初期化しています。また、インスタンス変数testClassObjには「*」を付けてポインタとしていますが、Objective-Cではクラスを利用するときは基本的にポインタを使用します。「TestClass testClassObj」という記述はNGです。ただしインスタンス変数を宣言する際にid型を使う場合は「*」は付けません。id型は内部で対象オブジェクトへのポインタを持っています。id型を使ってインスタンス作成を記述すると
1 |
id testClassObj = [[TestClass alloc] init]; |
となります。
§2 クラスの継承とNSObjectについて
1 2 |
TestClass *testClassObj = [TestClass alloc]; testClassObj = [testClassObj init]; |
さて、TestClassにはメソッドallocもinitも定義されていないのになぜこのメソッドが使えるのか?ということについて説明します。
このTestClassはNSObjectを継承して作られています。クラス宣言時にクラス名に続けて
「:(コロン)+継承元クラス名」
を記述することで継承させることができます。
1 2 3 4 5 6 7 8 9 10 |
#import <Foundation/Foundation.h> //クラス宣言部 @interface TestClass : NSObject{ //←←←NSObjectを継承している NSString *myString; } - (void)setMyString :(NSString*)inputString; - (void)printString; @end |
継承とは、既存のクラスの機能を受け継いで新しいクラスを作ることをいいます。つまり「既存クラスが持っているメソッドや変数をそのまま使える」ということになります。
継承元クラスを「スーパークラス」、継承して新しく作ったクラスを「サブクラス」と呼びます。NSObjectは、TestClassのスーパークラス、そしてTestClassはNSObjectのサブクラスということになります。
Objective-Cで使われるクラスはさまざまなクラスを継承して作られていて、継承元をどんどんたどっていくとNSObjectにたどり着きます。NSObjectは全てのクラスのスーパークラスです。このような一番の継承元となるクラスを「ルートクラス」と呼びます。
先ほどのallocとinitはルートクラスNSObjectで実装されているメソッドなので、NSObjectを継承して作られたTestClassはこのメソッドを使うことができます。allocとinitはルートクラスで実装されているので全てのクラスで使用できるということになります。
実際に自分でクラスを継承して使いこなせるようになるまでは「クラスを作るときはNSObjectを継承して作る」と覚えておけば良いと思います。
Objective-C 基礎 目次
以下の記事も参考にして頂ければと思います。
「Objective-C 基礎(1)- Xcodeのインストールとプロジェクトの作成」
「Objective-C 基礎(2)- Objective-Cの概要とメソッドの呼び出し」
「Objective-C 基礎(3)- クラス定義の方法」
「Objective-C 基礎(4)- クラスの使い方」
「Objective-C 基礎(5)- クラスメソッドとインスタンスメソッド」
「Objective-C 基礎(6)- 変数のスコープとプロパティ」
「Objective-C 基礎(7)- 変数のデータ型」
「Objective-C 基礎(8)- 文字列とNSStringクラス」
「Objective-C 基礎(9)- 可変文字列とNSMutableStringクラス」
「Objective-C 基礎(10)- Objective-Cの配列」
「Objective-C 基礎(11)- Objective-Cの連想配列」
「Objective-C 基礎(12)- ループ処理」
「Objective-C 基礎(13)- プロトコル」