3: 2017-12-07 (木) 13:09:43 njf |
現: 2018-05-22 (火) 18:30:10 njf |
| *このページについて [#v6c0967b] | | *このページについて [#v6c0967b] |
| | | |
- | 普段、cocos2d-xやadobe airなど、クロスプラットフォームのフレームワークを使っているため、たまにObjective-Cを使う場面でなかなか文法などを思い出せないときがあります。そんなときのために、Objective-C固有の文法などをまとめていっています。 | + | 普段、クロスプラットフォームのフレームワークを使っているため、たまにObjective-Cを使う場面でなかなか文法などを思い出せないときがあります。そんなとき、ひとまず読める程度に思い出すために、Objective-C固有の文法などをまとめていっています。 |
| | | |
| Objective-Cは基本的な文法はC、C++、Javaなどと同じため、それらと異なる部分を抜き出して書いています。また、上記のように他言語を使うことが多く、Objective-Cでがっつり開発することはないため、各々の項目についての詳しい説明は省いています。 | | Objective-Cは基本的な文法はC、C++、Javaなどと同じため、それらと異なる部分を抜き出して書いています。また、上記のように他言語を使うことが多く、Objective-Cでがっつり開発することはないため、各々の項目についての詳しい説明は省いています。 |
| **ログ出力 [#lc67acc8] | | **ログ出力 [#lc67acc8] |
| | | |
- | ログ出力はNSLogを使います。可変引数をとり、printfなどと同様のフォーマットが使えます。 | + | ログ出力はNSLogを使います。可変引数をとり、printfなどと同様のフォーマットが使えます。ただし文字列型はたいていNSStringを使うので、%sではなく%@を使います。 |
| | | |
| NSLog(@"Hello %d %d",10,20); | | NSLog(@"Hello %d %d",10,20); |
| // プロトタイプ宣言など | | // プロトタイプ宣言など |
| @end | | @end |
- | NSObjectは全てのクラスの元となるクラスなので、継承させるべき特定のクラスがないなら、これを継承させておくと便利です。 | + | NSObjectは全てのクラスの元となるクラスなので、継承させるべき特定のクラスがないなら、とりあえずこれを継承させておくと便利です。 |
| | | |
| **インスタンス変数の定義 [#i9be9d10] | | **インスタンス変数の定義 [#i9be9d10] |
| @private | | @private |
| int _a, _b; | | int _a, _b; |
- | という変数が定義され、setter、getterも定義されるので、ドット記法でプロパティにアクセスできるようになります。 | + | という変数が自動で定義され、setter、getterも定義されるので、ドット記法でプロパティにアクセスできるようになります。 |
| | | |
| instance.a = 1 | | instance.a = 1 |
| | | |
| **メソッド定義 [#r746ad6d] | | **メソッド定義 [#r746ad6d] |
| + | 「@interface」にプロトタイプ宣言、「@implementation」に実装を書きます。 |
| + | |
| + | - (戻り値の型) メソッド名:(型名)引数:(型名)引数:..... |
| + | |
| + | 先頭の「-」はインスタンスメソッドを表します。「+」だとクラスメソッドになります。 |
| + | |
| + | 例えば引数無しなら |
| + | |
| + | @implementation TestClass |
| + | - (int) getProduct{ |
| + | return _a * _b; |
| + | } |
| + | |
| + | 引数にラベルを付けるには |
| + | - (戻り値の型) メソッド名:(型名)引数 ラベル:(型名)引数 ラベル:..... |
| + | とします。 |
| + | |
| + | メソッドはprivateとかはないのですが、C言語などと同じでヘッダーファイルにプロトタイプ宣言を書くか、「.m」ファイルに書くかで関数の公開範囲を制限できます。つまり、ヘッダーファイルにプロトタイプ宣言を書かずに「.m」ファイルに |
| + | |
| + | @interface TestClass() |
| + | - (void) privateMethod; |
| + | @end |
| + | |
| + | と書いておけば、privateメソッドと同じように使えます。クラス名の後に「()」を忘れないようにしてください。 |
| + | |
| + | また、@propertyとかの前にメソッドを定義しようとするとエラーになります。 |
| + | |
| + | **クラスを使う [#t8c2e54c] |
| + | クラスによって違う事もありますが、インスタンス化はたいてい以下のようにします。 |
| + | TestClass *tc = [[TestClass alloc] init]; |
| + | allocがメモリの確保、initがコンストラクタです。 |
| + | |
| + | インスタンス変数へのアクセスはCの構造体やC++のインスタンスのように「->」でアクセスできます。 |
| + | tc->a = 10; |
| + | tc->b = 20; |
| + | |
| + | プロパティ定義がなされていると、「.」(ドット)でもアクセスできます。 |
| + | |
| + | tc.a = 12; |
| + | tc.b = 3; |
| + | |
| + | メソッドは |
| + | [インスタンス変数名 メソッド名:引数 ラベル:引数] |
| + | のように呼び出します。 |
| + | 例えば |
| + | [tc getProduct] |
| + | [tc getSum:10 : 12] |
| + | のようになります。 |
| + | これはjavaなどで言えば、 |
| + | tc.getProduct() |
| + | tc.getSum(10,12) |
| + | に対応する物です。 |
| + | |
| + | **親クラスへのアクセス [#f50f661c] |
| + | superを使います。 |
| + | [super メソッド名:変数とか] |
| + | |
| + | **自分のインスタンスへのアクセス [#l05a9438] |
| + | selfを使います。thisではありません |
| + | [self myMethod]; |
| + | |
| + | *@なんとか [#e9fe4863] |
| + | |
| + | **@interface [#s3f25a59] |
| + | Cとかで言うところのプロトタイプ宣言とかにあたるもの。@endまでに変数と関数の定義を書く。 |
| + | |
| + | **@implementation [#g86003d6] |
| + | @endまでに@interfaceで宣言したメソッドの処理を書く。 |
| + | |
| + | **@autoreleasepool [#ef0c8648] |
| + | 囲まれた範囲はメモリが自動で解放される。 |
| + | |
| + | **@property [#qbc2f41a] |
| + | 変数がスレッドセーフかとか、強い参照かどうかなどの属性と共にgetter,setterを自動で定義できる。 |
| + | |
| + | **@synthesize [#g69b0ab1] |
| + | たいてい「@property」とセットで使い、getter,setterの定義の変更とかに使う。 |
| + | |
| + | **@protocol [#p314526b] |
| + | 他の言語でいうところのインターフェース。@optionalが実装しなくても良い物で、@requiredは必須。 |