##用語整理
-
ビルド
コンパイルとリンクを経て実行可能ファイルを生成。 -
コンパイル
ソースコードを中間オブジェクトに変換。 -
リンク
諸々のライブラリやファイルを結合させて一つにまとめる。 -
コンパイラディレクティブ
Objective-Cにおいて、@で始まるものはプログラムでは無くコンパイラへの指示。
これをコンパイラディレクティブと言う。
##変数の利用
- 変数を利用するには
最初に宣言文を記述しておく必要がある。
int a;
- 型における演算子の注意点
int a = 3;
int b = 2;
float c = a / b;
この際、float c は1.5でなく1となる(int同士のa/bが先に計算されるため)。
int a = 3;
int b = 2;
float c = a / (float)b;
このように、aもしくはbもしくはab双方をfloat型にキャストしておけば、
intよりもfloatが優先され、計算結果もfloatとなり、cに正しい値が入る。
##構造体
複数のメンバを持つデータ
typedef struct Person {
float height;
float weight;
int birthYear;
} Person //struct PersionにPersionというaliasを切る。
Persion a; //変数宣言
a.height = 170.5;
##クラス
クラスの定義sample
ヘッダファイル(Sample.h)
@interface Persion : Mammal
@protected
//メンバ定義
int life;
float height;
float weight;
}
//アクセサ
@property int life;
@property float height, weight;
@end
実装ファイル(Sample.m)
#import "Sample.h"
@implementation Person
//インスタンスメソッド定義
- (int) getLife
{
hoge;
return;
}
-(void) healLife : (int) volume
{
life += volume
return;
}
//クラスメソッド定義
+ (int) exterminate
{
//gameover
return;
}
@synthesize life, height, weight;
@end
####インスタンスの生成方法
Person *tarou = [[ Persion alloc ] init];
//メンバセット
tarou->life = 10;
//メソッド呼び出し
[tarou getLife]
[tarou healLife :5]
//クラスメソッド呼び出し
[Person exterminate]
##ヘッダファイルと実装ファイル
プログラムを分割して記述するための仕組み
-
ヘッダファイル(.h)はクラスの「目次」
→このファイルのみでクラスの全体を俯瞰できる。
→@interface〜@end
→クラスの目次(宣言)(〜終わり) -
実装ファイル(.m)はクラスの「本体」
→@implementation〜@end
→クラス実装(〜終わり)
※分割のメリット・・クラスを外部に公開する際、ヘッダファイルだけでもユーザはそのクラスを利用できる。
一方実装の内部は隠蔽することができる。
import文
別ファイルのプログラム、ライブラリを読み込む。
文末にセミコロンが不要。
- ヘッダファイル(.h)に書く場合
importに続くクラス宣言(@interface)で指定されている親クラスがある場所を示す。
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
→Apple提供のUIKitフレームワーク内のUIKit.hを読み込む。
ViewControllerの親クラスであるUIViewControllerはその中に存在する。
- 実装ファイル(.m)に書く場合
ヘッダファイルの場所を示す
##allocとinitとnew
Person *tarou = [[Persion alloc] init];
-
alloc
インスタンスの生成に必要なメモリ容量を確保する。 -
init
メモリ上にロードされたインスタンスに対して実行する。
→インスタンスがデータを保存出来る状態にする。コンストラクタを呼ぶ。 -
new
alloc + init
Person *tarou = [Persion new];
##id型
汎用オブジェクト型。
どのような参照型にも変化することが出来る。
最初に型を決めずに変数を用意し、実際に使うタイミングで型を決定する。
→動的な型付け
id オブジェクト型
id obj; //具体的な型は決まっていない。
obj = [[Person alloc] init]; //この時点でPersonクラスになる。
-
@property
プロパティを宣言すると、同名のインスタンス変数に対するアクセサ(setter/getter)が自動生成される。 -
@synthesize
@propertyで指定した属性に対してアクセサメソッドを定義する。
##コンストラクタ
init(NSObject)を上書きする。
@implementation Person
-(id) init
{
if(self = [super init]){
life = 1;
height = 1;
weight = 1;
}
return self;
}
##メモリ
使わなくなったインスタンスを解放する。
-
保持カウンタ
インスタンス生成時に値1で初期化される。
NSObjectクラスのretainCountというプロパティが保持している。
保持カウンタの値が0になった時点で、メモリ上から解放される。 -
retain:保持カウンタの値を1増やす
-
release:保持カウンタの値を1減らす
10/17
とりあえずここまで