Ad
2: 2017-12-07 (Thu) 08:17:22 njf source Edit Backup No.2 as current. Cur: 2018-05-22 (Tue) 18:30:10 njf source Edit
Line 1: Line 1:
*このページについて [#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でがっつり開発することはないため、各々の項目についての詳しい説明は省いています。
Line 14: Line 14:
**ログ出力 [#lc67acc8] **ログ出力 [#lc67acc8]
-ログ出力はNSLogを使います。可変引数をとり、printfなどと同様のフォーマットが使えます。+ログ出力はNSLogを使います。可変引数をとり、printfなどと同様のフォーマットが使えます。ただし文字列型はたいていNSStringを使うので、%sではなく%@を使います。
 NSLog(@"Hello %d %d",10,20);  NSLog(@"Hello %d %d",10,20);
Line 31: Line 31:
 // プロトタイプ宣言など  // プロトタイプ宣言など
 @end  @end
-NSObjectは全てのクラスの元となるクラスなので、継承させるべき特定のクラスがないなら、これを継承させておくと便利です。+NSObjectは全てのクラスの元となるクラスなので、継承させるべき特定のクラスがないなら、とりあえずこれを継承させておくと便利です。
**インスタンス変数の定義 [#i9be9d10] **インスタンス変数の定義 [#i9be9d10]
Line 46: Line 46:
**プロパティ定義 [#x794a50f] **プロパティ定義 [#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は必須。


Front page   Edit Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 1166, today: 3, yesterday: 1
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失


NJF