2012-02-19 21 views
0

私はObjective-Cを学びましたが、最近(ViewControllerのすべてを持つ代わりに)クラスの使用を開始しました。私は他のクラスでアクセス可能にしたい変数をどうすればいいのか分からないという問題があります。目的C、クラス、およびグローバル変数

私は "ViewController"で作成されたUIViewのNSArrayを持っています。その後、画面サイズに基づいてフレームを設定する「LayoutManager」に渡されます。この配列はまた、私の "BlockManager"と "ColorManager"からアクセスする必要があります。

同様のケースでこの配列やその他の変数を処理する最適な方法は何ですか?グローバル変数を使用する必要がありますか?それとももっと良い方法がありますか?

答えて

2

グローバル変数は、オブジェクト指向プログラミングでは一般的に悪い考えです(シングルトンパターンはおそらく許容可能な例外ですが、意見は異なります)。一般的には、生データを共有しないようにして、誰でも自分の望むことをやり遂げることを望んでいます。すべての人に内部実装に関する知識を与える必要があり、管理が非常に困難になります。

LayoutManagerはワンショットタスク(1回転につき1回)のように聞こえるので、オブジェクトのやりとりは「ここに私の見解はありますか?そのオブジェクトのライフサイクル全体。だから、initに配列を渡すと、クラスを一度実行させてから解放します。

BlockManagerColorManagerには、ビューに関連してビューコントローラに返信する必要がある場合は、適切なデリゲートプロトコルを作成する必要があります。それで、コミュニケーションの行は、彼らが知っておくべき計算したものを表示コントローラに知らせ、アレイ上で行動を起こすことを担当するということです。

+0

私は、その意味でデリゲートを使用してビューコントローラに配列を残すことを考えていませんでした。私はそれを試してみる。私はビュー内のすべてを管理することになっているクラスはViewControllerだと思うので、理にかなっています。 – jadengeller

2

シングルトンである必要はないコントローラを管理するためにシングルトンを過度に使用する問題に遭遇しているようです。これが役に立つことがあります。

私は最近、それらが必要だとして、に沿ってオブジェクトを渡すことにシングルトンから私の全体のプログラムを手直し。シングルトンと共有グローバルオブジェクトは同一ではなく、Apple独自のクラスはsharedObjectまたはdefaultObjectを使用してインスタンスを生成し、共有インスタンスを返しますが、実際に自分の必要に合わせて別のインスタンスを作成することはできません。

シングルトンはオブジェクトを単一のインスタンスに制限します。これは、どこからでも完全にアクセスできるように、2つのインスタンス(将来必要になる可能性があります)を持つことを意味します。その意味では、1つのインスタンスの制限ではなく、実際にはアクセス部分全体が必要なだけなので、sharedObjectパターンと考えることができます。ここでは例を示します。

// Up the top in the .m file 
static MySharedClass *sharedInstance; 

// A class method to return the shared instance 
+ (MySharedClass *)sharedInstance { 
    if (!sharedInstance) { 
     sharedInstance = [[MySharedClass alloc] init]; 
    } 
    return sharedInstance; 
} 

は、それらがすべてによるアクセスのために、グローバルにすべてを設定するのではなく、必要とされているように私は、オブジェクトを渡すためにあなたのプログラムを構築検討する、と述べました。さもなければ、シングルトン/グローバルオブジェクトを過度に使用して記述したコードははるかに結合されており、現在のプロジェクトから引き出されずに他の場所で使用されることもなく、これらのマネージャクラスのグローバルな状態を考慮する必要があるため、

メインコントローラ(ViewController)を作成し、必要な他のコントローラクラスをインスタンス化し、それらの間でリソースを渡します。あなたが言及したこのUIViewのNSArrayは、必要に応じてチェーンの上位に格納され、おそらくトップの上に置かれます。このプレゼンターはLayoutManagerを作成し、それに必要なオブジェクトを渡して後で作業します。同様に、これらのオブジェクトをBlockManagerとColorManagerに渡します。