Ad
2: 2017-12-07 (木) 08:17:22 njf ソース バックアップ No.2 を復元して編集 現: 2018-05-22 (火) 19:30:10 njf ソース 編集
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は必須。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 2377, today: 2, yesterday: 0
MenuBar
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失

Portuguese | English | German | Greek | Japanese | Korean | Russian | T-Chinese top
NJF