objectiveの中の単例モード

1603 ワード

Javaプログラムでは、objective-cと同様に使用できる単一のモードが最も一般的ですが、javaとは少し違います.
Javaで単一のパターンを定義する方法を簡単に見てみましょう
public class SingletonClass {
private static SingletonClass instance = null;
private SingletonClass(){
}
public static final getInstance(){
synchorinzed(this){
if(instance == null){
instance = new SingletonClass();
}
return instance
}
}
}
ios開発では、まだ少し違いがあります.objective-cでは、オブジェクトは[SingletonClass] alloc]はメモリ割り当てを行い、新しいインスタンスオブジェクトを返すことができ、allocメソッドはpublicであり、クラスを呼び出さないのでallocメソッドを書き換える必要があります.
一般的にallocメソッドは+(id)allocWithZone:(Zone*)zoneを呼び出して初期化するのでallicWithZoneで初期化状態の判断を行うだけでよい
ヘルプ
1
2
3
4
5
6
7
8
9
10
11 +(id) allocWithZone:(NSZone *)zone{
  if( instance == nil){
  instance = [super allocWithZone:zone ];
  }
  return instance;
  }
objective-cではallocメソッドはクラスのインスタンスにメモリアドレスを割り当てる役割を果たし,簡単に言えばインスタンスメンバーのメモリアドレスを初期化し,このアドレスは初期アドレス+オフセットアドレスに基づいて計算される.実はjavaの中で、この過程もありますが、javaは静的言語で、clasファイルにコンパイルするとき、クラスの中のすべてのインスタンス属性は1つの変数テーブルに記録され、一般的には変数テーブルを通じて対応する実際のアドレスに間接的に関連しています.objective-cはベースアドレスに対するクラス属性のオフセットに基づいて計算される
これは、例えばint*pのポインタを定義し、p[5]を使用すると、pというポインタが指すアドレス+2*5に対してp[5]のアドレスとして使用される.
allocメソッドではインスタンス変数にメモリアドレスを割り当てるだけでretainカウントを1増加させるが,このときポインタ変数ではアドレスが指す値はnilであり,初期化するにはinit先頭のメソッドで初期化する.objective-cでは、割り当てアドレスと初期化は別々に行われ、javaのnewキーワードには、割り当てアドレスと初期化のプロセスが含まれており、javaの構造関数に似ています.しかしobjective-cはすべて公開されており、javaの中の私有構造関数という言い方はありません.