1: 2017-12-07 (木) 05:44:26 njf[5] [6] [7] | 現: 2018-05-22 (火) 18:30:10 njf[5] [8] [9] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | 普段、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は必須。 |
(This host) = https://njf.jp