インスタンスの初期化の方法、参照の仕方について悩んでいます

99 views
Skip to first unread message

overisland

unread,
Feb 24, 2010, 9:05:33 AM2/24/10
to cocoa-dev-japan
一般的な質問なのですが、「インスタンス」というものに関して、初期化の方法や参照の仕方について悩んでいます。

Cocoa において、私が理解している限り、クラスを初期化してオブジェクト(インスタンスオブジェクト)を生成するには以下の方法があるようで
す。

方法1. Interface Builder で Nib ファイルにクラスのオブジェクトを追加
方法2. コードで、 [MyClass alloc] init]; のようにクラスの初期化メソッドを呼ぶ。

もし、これ以外に方法があったら教えてください。
この理解が正しいとすると、方法1 と 方法2 を、どのように使い分ければいいのか、いまいち分からないのです。
それぞれの方法に関して不明な点を書いてみます。

【方法1 - IB で Nibファイル に追加】
方法1 をとる必要があるのは、
i. インスタンスから IBOutlet で他のビューやオブジェクトを参照したい場合
ii. Cocoaバインディングのデータモデルとして接続してもらいたい場合

方法1 で困ることは、
方法1 で MyClass をインスタンス化したとします。
ここで、他のオブジェクトから MyClass のインスタンスメソッドを呼び出したいとします。メソッドを呼び出すために、MyClass のインス
タンスを参照する必要がありますが、 InterfaceBuilder で生成されたインスタンスであるために、
IBOutlet MyClass *_myClass;
のようにアウトレットで MyClass のインスタンスに接続し、_myClass に対してインタンスメソッドを呼び出すしかないように思えま
す。しかし、IBOutlet を出すためには、そのクラス自身も InterfaceBuilder でインスタンス化しなければならないので、結果
的にあらゆるクラスをInterfaceBuilder でインスタンス化し、IBOutlet でつなぎまくることになり、とても複雑なプロジェクト
ができあがると思います。

この事に関しては、「インスタンスから IBOutlet で他のビューやオブジェクトを参照したい場合」は そういうクラスを File's
owner にして、File's Owner からアウトレットを出すという方法があると思います。が、「他のビューやオブジェクトを参照したいクラ
ス」が複数があった場合はどうすれば良いのか分からず悩んでいます。


【方法2 - コード内で [MyClass alloc] init]; 】
たとえば、
MyClass* _myClass= [MyClass alloc] init];
とやれば MyClass のインスタンスを得ることができます。
しかし、_myClass はローカル変数もしくはインスタンス変数だとすると、他のクラスから MyClassのインスタンスを参照できなくなりま
す。作ったインスタンスを、さまざまなクラスから参照する、というのは良くあることだと思います。これを解決するためには、 _myClass をグ
ローバル変数として宣言しておいて、
MyClass* _myClass= [MyClass alloc] init];
とやるしかないのでしょうか。グローバル変数ということは、どのクラスで上記の実装をしたとしても、全てのクラスからアクセスできることになります。
そのため、どんなタイミングでどのクラスで上記の初期化メソッドを呼び出すのが適切なのか分かりません。


次に、上記の話とは少しズレた話になってしまうのかもしれませんが、インスタンスは
・アプリケーション中で1個しか存在しないインスタンス→シングルトンインスタンスとして実装
・ウインドウ1つにつき1つしか存在しないインスタンス→ 【方法1】のようにNibファイルでインスタンス化し、コード内で初期化メソッドを呼ばな
ければ保証される?

このあたりもピンときていません。
長文かつ、うまく伝わりにくい部分も多々あると思いますが、とにかく疑問が山積みです。アドバイスをいただけると幸いです。

blue_field

unread,
Feb 24, 2010, 9:34:30 AM2/24/10
to cocoa-dev-japan

On 2月24日, 午後11:05, overisland <overislan...@gmail.com> wrote:
> 方法1. Interface Builder で Nib ファイルにクラスのオブジェクトを追加
> 方法2. コードで、 [MyClass alloc] init]; のようにクラスの初期化メソッドを呼ぶ。

理論的に考えれば、方法2で全て実装可能です
方法1をとる理由があるとすれば、部分的に手間が減らせるということです

チェックボックスで各種属性をセットしたり、マウスでViewのサイズ調整したりする手間と
コードを書く手間は、どちらが多いですか?
普通は手間が少なそうな方を選びます

そして、1か2のどちらかの方法で「全て」を完結させなければならないわけではありません
部分部分で、楽な方を選びます


> グローバル変数として宣言しておいて、


> MyClass* _myClass= [MyClass alloc] init];
> とやるしかないのでしょうか。グローバル変数ということは、どのクラスで上記の実装をしたとしても、全てのクラスからアクセスできることになります。

・参照を必要とするクラスに、setMyClass:(MyClass*)myClass;を実装する
・delegateを実装する
・Notificationで渡す
・シングルトンで参照する
渡し方はいろいろあるでしょう


> 次に、上記の話とは少しズレた話になってしまうのかもしれませんが、インスタンスは
> ・アプリケーション中で1個しか存在しないインスタンス→シングルトンインスタンスとして実装

2つ以上あっては困る事情があるなら、シングルトン
複数あっても問題なく、今たまたま1つで十分ということであれば、シングルトンにするかどうかは、手間の問題も合わせて考えれば良いかと思います。この
場合は、シングルトンにしなければならないわけであはありません。

Reply all
Reply to author
Forward
0 new messages