「インスタンス」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「'''インスタンス'''(英語:instance)とは、「実体」のことである。 == アプリケーション == ROMHDDの中に格納されてい…」)
 
 
(同じ利用者による、間の5版が非表示)
22行目: 22行目:
  
  
この挙動は[[Objective-C]]がわかりやすい。<syntaxhighlight lang="objective-c">
+
この挙動は[[Objective-C]]がわかりやすい。
 +
Objective-Cではメモリ確保(alloc)と初期化(init)の2挙動を明示的に行うようになっている。
 +
<syntaxhighlight lang="objective-c">
 
Class* instance = [[Class alloc] init];
 
Class* instance = [[Class alloc] init];
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
Objective-Cではメモリ確保(alloc)と初期化(init)の2挙動を明示的に行うようになっているが、その他の多くの[[言語]]では「new」とするだけで一発で行うことができる。<syntaxhighlight>
+
Objective-C以外の多くの[[言語]]では「new」とするだけで一発で行うことができる。
Class* instance = new Class();
+
このような場合でも内部的にはメモリ確保(alloc)と初期化(init)は別々に実行されている。<syntaxhighlight>
</syntaxhighlight>このような場合でも内部的にはメモリ確保(alloc)と初期化(init)は別々に実行されている。
+
Class instance = new Class();
 +
</syntaxhighlight>
  
 
ここで注意しなければならないのは「newであっても、内部は2挙動であり、その2挙動は連続実行されるとは限らない」という点である。
 
ここで注意しなければならないのは「newであっても、内部は2挙動であり、その2挙動は連続実行されるとは限らない」という点である。
  
たとえば[[C#]]ではその2挙動は連続実行される。一方で[[Java]]ではnewすると即座にメモリ確保だけは行われるが、初期化はそのインスタンスの「最初の利用時」に実行される。<syntaxhighlight lang="java" line="1">
+
たとえば[[C#]]ではその2挙動は連続実行される。一方で[[Java]]ではnewすると即座にメモリ確保だけは行われるが、初期化はそのインスタンスの「最初の利用時」に実行される。<syntaxhighlight lang="java">
Class instance = ne Class();// allocが実行される
+
// newでメモリ確保が実行される
instance.Hello(); // initが実行されたのちHelloメソッドが実行される。
+
Class instance = new Class();
 +
 
 +
// 初回は初期化(コンストラクタ)が実行されたのちHelloメソッドが実行される。
 +
instance.Hello();  
 +
 
 +
// 2回目は普通にHelloメソッドだけ実行される。
 +
instance.Hello();
 
</syntaxhighlight>この挙動によりJavaでは[[ダブルチェックロッキング]]が実装できない。
 
</syntaxhighlight>この挙動によりJavaでは[[ダブルチェックロッキング]]が実装できない。
  
 
== 関連項目 ==
 
== 関連項目 ==
 
 
* [[副作用]]
 
* [[副作用]]
 
* [[自己参照]]
 
* [[自己参照]]
 
* [[関数ポインタ]]
 
* [[関数ポインタ]]

2019年10月11日 (金) 02:29時点における最新版

インスタンス英語:instance)とは、「実体」のことである。

アプリケーション[編集 | ソースを編集]

ROMHDDの中に格納されているアプリプログラム)がRAMに読み込まれ実行可能な状態になったものを「インスタンス」という。

現実的には、上記のようにプログラムRAMに読み込まれ、実行が開始され、ある程度の初期化を済ませた状態を指すことが多い。

この初期化処理の際に「同名のアプリが起動しているか」をチェックして終了するものを「シングルインスタンス」、チェックしないものを「マルチインスタンス」などと呼ぶ。

Windows[編集 | ソースを編集]

Windowsはマルチインスタンスが基本となっている。スタートメニューやタスクバーのアイコンをクリックすると次々と同じアプリが立ち上がる。

このため多くのプログラマーが「多重起動防止する方法」を調べるのが定番となっている。

AndroidやiOS[編集 | ソースを編集]

AndroidiOSはシングルインスタンスが基本となっている。スマホという特性上こちらのほうが使い勝手がいいからだ。

このため多くのゲーマーがチートするために「マルチインスタンス化する方法」を調べているようだ。

プログラミング[編集 | ソースを編集]

構造体クラスの定義をもとに、メモリを確保し、初期化処理までを完了したものを「インスタンス」とをいう。


この挙動はObjective-Cがわかりやすい。 Objective-Cではメモリ確保(alloc)と初期化(init)の2挙動を明示的に行うようになっている。

Class* instance = [[Class alloc] init];


Objective-C以外の多くの言語では「new」とするだけで一発で行うことができる。

このような場合でも内部的にはメモリ確保(alloc)と初期化(init)は別々に実行されている。

Class instance = new Class();

ここで注意しなければならないのは「newであっても、内部は2挙動であり、その2挙動は連続実行されるとは限らない」という点である。

たとえばC#ではその2挙動は連続実行される。一方でJavaではnewすると即座にメモリ確保だけは行われるが、初期化はそのインスタンスの「最初の利用時」に実行される。

// newでメモリ確保が実行される
Class instance = new Class();

// 初回は初期化(コンストラクタ)が実行されたのちHelloメソッドが実行される。
instance.Hello(); 

// 2回目は普通にHelloメソッドだけ実行される。
instance.Hello();

この挙動によりJavaではダブルチェックロッキングが実装できない。

関連項目[編集 | ソースを編集]