1: 2017-12-07 (木) 05:44:26 njf |
現: 2018-05-22 (火) 18:30:10 njf |
- | 普段、cocos2d-xやadobe airなど、クロスプラットフォームのフレームワークを使っているので、たまにObjective-Cを使わないと行けない場面で、なかなか文法などを思い出せないときがあります。そんなときのために、Objective-C固有の文法などをまとめていっています。 | + | *このページについて [#v6c0967b] |
| + | |
| + | 普段、クロスプラットフォームのフレームワークを使っているため、たまにObjective-Cを使う場面でなかなか文法などを思い出せないときがあります。そんなとき、ひとまず読める程度に思い出すために、Objective-C固有の文法などをまとめていっています。 |
| + | |
| + | Objective-Cは基本的な文法はC、C++、Javaなどと同じため、それらと異なる部分を抜き出して書いています。また、上記のように他言語を使うことが多く、Objective-Cでがっつり開発することはないため、各々の項目についての詳しい説明は省いています。 |
| + | |
| + | *基本 [#n4f274d4] |
| + | |
| + | **文字列 [#c7733e7a] |
| + | 引用符と共に最初に「@」をつけるとNSStringという型になります。基本的に文字列はこれを使います。 |
| + | |
| + | NSString *s = @"これはテスト"; |
| + | |
| + | **ログ出力 [#lc67acc8] |
| + | |
| + | ログ出力はNSLogを使います。可変引数をとり、printfなどと同様のフォーマットが使えます。ただし文字列型はたいていNSStringを使うので、%sではなく%@を使います。 |
| + | |
| + | NSLog(@"Hello %d %d",10,20); |
| + | |
| + | 結果 |
| + | |
| + | Hello 10 20 |
| + | |
| + | *クラス関連 [#f9e052ac] |
| + | |
| + | **クラス定義 [#a5d1d8ae] |
| + | クラス定義は「@interface クラス名:親クラス」とします。 |
| + | @interface TestClass:NSObject{ |
| + | // プロパティ定義など |
| + | } |
| + | // プロトタイプ宣言など |
| + | @end |
| + | NSObjectは全てのクラスの元となるクラスなので、継承させるべき特定のクラスがないなら、とりあえずこれを継承させておくと便利です。 |
| + | |
| + | **インスタンス変数の定義 [#i9be9d10] |
| + | 「@interface」で囲まれている中で定義します。 |
| + | @interface TestClass:NSObject{ |
| + | @public |
| + | int a; |
| + | @private |
| + | int b; |
| + | } |
| + | @end |
| + | |
| + | 「public」「protected」「private」などのアクセス制限が使えます。 |
| + | |
| + | **プロパティ定義 [#x794a50f] |
| + | 「@property」を使うと、先頭に「_」(アンダーバー)がついたプライベート変数が定義され、同時にsetter、getterも定義されます。 |
| + | |
| + | @property int a,b; |
| + | |
| + | とすると、 |
| + | @private |
| + | int _a, _b; |
| + | という変数が自動で定義され、setter、getterも定義されるので、ドット記法でプロパティにアクセスできるようになります。 |
| + | |
| + | instance.a = 1 |
| + | instance.b = instance.a |
| + | |
| + | といった記法が可能になります。 |
| + | 「@property」で「readonly」を指定して読み取り専用変数にしたりも出来ます。 |
| + | また、よく使われる「atomic/nonatimic」はスレッドセーフかどうかの違いです。 |
| + | 他にstrongは強い参照(参照が他で消されてもデータを保持)、copyはオブジェクトのコピーをとって保持(参照渡しではなく、実体が渡される感じ)します。 |
| + | |
| + | **メソッド定義 [#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は必須。 |