ページへ戻る

− Links

 印刷 

iOS​/Objective-C​/チートシート のバックアップの現在との差分(No.1) :: NJF Wiki

xpwiki:iOS/Objective-C/チートシート のバックアップの現在との差分(No.1)

  Next »[4]
1: 2017-12-07 (木) 05:44:26 njf[5] ソース[6] バックアップ No.1 を復元して編集[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は必須。
  Next »[4]