instance = [[SomeClass alloc] init];
- インターフェース部(.h)と実装部(.m)に分けて定義する
- メソッドの宣言は - か + ではじまる。- はインスタンスメソッド、+ はクラスメソッド
- (返り値の型) メソッド名の一部:(引数1の型)引数1の名前 メソッド名の一部:(引数2の型)引数2の名前
- イニシャライザの実装では、必ず最初に親クラスのイニシャライザを呼ぶ
- デフォルトは @protected
- @public は普通使わない
- @private にしたいものだけ @private 以下に書く
- クラスの外からアクセスしたい場合はアクセサメソッドを定義する
- メソッド
- インターフェース部に宣言されているものは全て public
- Objective-C にはプライベートメソッドを定義する仕組みがない
- プライベートメソッドとして使いたい場合はヘッダーで宣言しないという方法をとるが、公開されないだけで呼び出すことはできる
- Objective-C のメモリ管理方法はリファレンスカウンタ方式とガーベッジコレクション方式の2つ
- iOS 環境で利用できるのはリファレンスカウンタ方式のみ
- 不要になったメモリが開放されなければメモリリーク
- すでに解放されたメモリ領域を参照するとクラッシュ
- リファレンスカウンタ方式
- あるオブジェクトが生成された時にカウンタを1
- 参照されるたびにカウンタを1増やす(retain)
- 参照をやめたときにカウンタを1減らす(release)
- 今は ARC が自動でやってくれる
- デフォルトは強い参照
- 「保持の循環」が発生する恐れがある場合は弱い参照
- オブジェクトを参照するだけでカウンタを増やさないものを「弱い参照」と呼ぶ
- アクセサメソッドを簡単な記述で生成できる
- ドット演算子によるアクセサの呼び出しができる
- インターフェース部(@interface)
// strong はデフォルトなので省略可
@property (strong) NSString *name;
// オブジェクト以外の int型等には assign を指定
// assign はデフォルトなので省略可
@property (assign) int age;
// readonly と記述すると setter が生成されず、getter のみ生成
@property (strong, readonly) NSString *name;
// @synthesize プロパティ名 = 対応するインスタンス変数名;
@synthesize name = _name;
@synthesize name; // と書くと上と同じ意味
@synthesize age = _age;
- ひとつのクラスの定義を複数のモジュールに分割することができる
- 書き方
@interface クラス名 (カテゴリ名)
@implementation クラス名 (カテゴリ名)
// カテゴリを使ったクラスのファイル名は以下のように+をつける
ClassName+CategoryName.m
- カテゴリを使うと簡単に既存クラスの拡張(メソッドの追加)ができる
- クラス名と同じくカテゴリ名にもプレフィックスをつけることが推奨されている
- プロトコルはメソッドの宣言の集合
- あるプロトコルに適合しているクラスは、そのプロトコルに宣言されているメソッドを実装していることが保証される
- 使い方
@interface クラス名 : 親クラス名 <プロトコル名>
// 複数のプロトコルを指定することもできる
<Protocol1, Protocol2, Protocol3>
- 文字列
- 配列
- 辞書(連想配列)
- NSDictionary
- NSMutableDictionary
- 数値のラッパー
- 生のバイト列データ