Objective-C勉強日記(2) クラスの仕組み

第3回 Objective-Cのクラス定義を理解しよう

Objective-Cのクラス定義を理解しよう – @IT
  • インスタンス変数のスコープは、public, protected, public, package。javaと同じ感じ。
  • 指定しなかった場合は、protectedになるところは、javaと違うか。

e. 引数が2つと戻り値があるメソッド

    - (NSString *)myMethod5:(NSString *)argString
myInt:(int)argInt;
↓メソッドの実行例
NSString *result = [test myMethod5:@"test" myInt:5];

(snip)

最も特徴的なのは、eでしょう。第2引数に注目してください。int型のargIntという引数を受け取っていることは分かると思います。では、:(コロン)の前に記述されている「myInt」は何を表しているのでしょうか。

Objective-Cのクラス定義を理解しよう – @IT

おー、これは難しい。

 上記eのメソッド名は、「myMethod5:myInt:」です。メソッド名には:(コロン)も含まれるため、aのメソッド名は「myMethod1」、cのメソッド名は「myMethod3:」ということになります。

Objective-Cのクラス定義を理解しよう – @IT

なんか、言語のデザインとしてありなんだろうか?

キーワード引数的な機能なんだろうけど、第一引数を特別扱いしすぎじゃないのかと思ってしまう。

分かり易いメソッド名を命名するのを妨げてしまいそうだけど、大丈夫なのかな。

ここで、NSObject.hを見てみると、以下のように、第2、第3の引数のキーワードが同じものを指定してある。

- (id) performSelector: (SEL)aSelector
withObject: (id)object1
withObject: (id)object2;

そうか、何となくどう使ってほしいかわかった気がする。常にキーワード引数として呼び出すしか方法が用意されていないのか。


  • インスタンスメソッドの定義には、- を付ける。クラスメソッドの定義には+を付ける。
  • プロパティとアクセサ。アクセサは、test.myPropのように記述できるが、これは、メッセージ式のメソッド呼び出しのシンタックスシュガーみたいなものらしい。その代わりid型の変数では使用できない。
  • コンストラクタのサポートは、最近の言語のようには行かないらしい。基本NSObjectのallocとinitメソッドを使って、インスタンスを生成するようだ。
  • 引数のあるコンストラクタを実装したい場合、initの代わりにinitXXXというメソッドを用意するらしい。他の人が作ったクラスのインスタンスを生成する時は、ドキュメントを読めということか。

まとめ

Objective-Cは、想像以上に異質な世界だ。言語の仕組みが、こうなっている理由が今は全然理解できない。Smalltalkの経験が無いからだろうか?

これにめげずに、もうちょっと読み勧めてみたい。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.