102
79

More than 5 years have passed since last update.

Objective-Cの基本

Last updated at Posted at 2013-10-22

用語整理

  • ビルド
    コンパイルとリンクを経て実行可能ファイルを生成。

  • コンパイル
    ソースコードを中間オブジェクトに変換。

  • リンク
    諸々のライブラリやファイルを結合させて一つにまとめる。

  • コンパイラディレクティブ
    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@synthesize

  • @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
とりあえずここまで

102
79
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
102
79