2011-08-02 19 views
0

シングルトンをたくさん使用しています。私はシングルトンフレームワークと呼んでいます。iOSでプレフィックスヘッダーにシングルトンが存在する可能性のある問題

また、XCodeプロジェクトのプレフィックスヘッダーにシングルトンの定義を書きたいので、すべてのクラスですべてのシングルトンを1行のコードで使用できます。 私にはこれは天国のようだが、私はすべてのアプリでメモリの警告をたくさん扱わなければならないことに気づいている。だから私は疑問に思っていました。私のシングルトンの定義をプレフィックスヘッダに入れることと関係がありますか?私にとっては、シングルトンはプレフィックスヘッダーに入れるかどうかは関係ありません。 多分、8つの異なるシングルトンが同時に存在し、それぞれが異なるオブジェクトを持つという事実はありますか?ここで

は私のプロジェクトでは、通常のプレフィックスヘッダの例です:

//Imports 
#import "Program.h" 
#import "Category.h" 
#import "GetSpecs.h" 
#import "FlurryAPI.h" 
#import "AdSmallView.h" 
#import "SoundPlayer.h" 
#import "ButtonAlert.h" 
#import "NSViewHelper.h" 
#import "NSDateHelper.h" 
#import "NSStringHelper.h" 
#import "TESTAppDelegate.h" 
#import "EGORefreshTableHeaderView.h" 

//Singletons 
#define gSpecs [GetSpecs sharedGetSpecs] 
#define bAlert [ButtonAlert sharedButtonAlert] 
#define sPlayer [SoundPlayer sharedSoundPlayer] 
#define adSmallV [AdSmallView sharedAdSmallView] 
#define vHelper [NSViewHelper sharedNSViewHelper] 
#define dateHelper [NSDateHelper sharedNSDateHelper] 
#define nsprefs [NSUserDefaults standardUserDefaults] 
#define strHelper [NSStringHelper sharedNSStringHelper] 
#define pDel ((TESTAppDelegate *)[[UIApplication sharedApplication] delegate]) 

そう結論に、私は2つの質問を持っている:プレフィックスヘッダにシングルトンの定義を置くために悪い習慣 1.ですか? 2.このプレフィックスヘッダー部分によってメモリの問題が発生する可能性がありますか、それとも、多くの異なるシングルトンが連続して「生きている」という事実は可能でしょうか?

+0

実際には、メモリ警告の種類を書く必要があります。最初の質問については、#defineを使用しているので、おそらく実際には下のコードを「置き換える」だけですが、あなたは常に効率的な方法ではなくsharedXXXメソッドを使用しています...最初に一度呼び出す変数の中で、最後まで使用する方が効率的です。 2番目の質問、必要なメモリ警告/問題、そしてあなたのシングルトンテンプレートもいいでしょう。 – lm2s

+1

"(同じコード行を何度も書くのは嫌いです)だから、シングルトンを作り、どこでも使えるのが大好きです。あなたは私たちのことを冗談にしていますよね? – Caleb

+0

メモリ警告は、非常に多くの異なるシングルトンインスタンスを浮遊させることによって引き起こされる可能性があります。明示的にどこかでそれらを解放しない限り、アクセスされると、アプリケーションが存在するまでメモリに残ります。シングルトンのための時間と場所があります。あなたのデザインパターンが、メモリが少ないモバイルデバイスに適しているかどうかを検討する必要があります。レイジーロードのものと完了時のリリースの方が一般的です。 – jdmunro

答えて

0

興味深いアプローチ。これをプリコンパイル済みのヘッダに#defineとすることは問題ではありません。これにより、どこでも使用できるようになります。また、jtbandesによれば、使用時にのみ呼び出されるため、メモリは考慮されません。

私は、ローカル変数名のように見えるグローバルな「魔法の」予約語を本質的に作成しているように、ちょっと馬鹿に思っています。他の人があなたのコードを読んでいるなら、特に自明ではありません。これを行うなら、私はおそらく少なくとも資本でそれらを開始するか、それらが定義/マクロであることを示すためにそれらをすべて大文字にします。

あまりにも多くのアプリのヘッダーをプリコンパイル済みのヘッダー(通常はかなりリーンでコアシステムのものに使用されています)にプルするのは少し非正統ですが、現代のマシンでのコンパイル時の実際の影響はまったく無視されます。


なぜシングルトンを作成するのか、メモリの警告が表示されるため、あなたはまだプログラミングを学習していると思うようになります。シングルトンは、オブジェクト指向の世界では一度しか存在しないオブジェクトをカプセル化するうまい方法です。 「同じコードを何度も何度も書く」ことを避けるためにそれらを使用しているのであれば、それが必要な通常の関数やメソッドも同様に機能します。 "ヘルパー"のためには、あなたのための持ち上げのいくつかを行うかもしれない "カテゴリ"を調べるべきです。再:8つの異なるシングルトン。あなたのアプリが動いている間、シングルトンやその他の間に、幾つものオブジェクトが同時に存在します。それだけでは問題ではありません。すべてが正しく管理されている限り、彼らは互いに気にしません。

+0

こんにちはquixoto、あなたの応答に感謝します。私はまだ客観的な世界に新しいことは本当です。私はJava/Matlabを4年間学びましたが、ちょうど1年前にiPhone/iPadプログラミングを始めました。私は言語を愛していますが、私はまだ私が推測する最良のデザインパターンを学んでいます。ここでの答えは、プレフィックスヘッダーは問題ではないと信じていますが、シングルトンはすべて一度に生きている可能性があります。私は戻って、私が本当にシングルトンを必要としているかどうかを見なければならないと思います。カテゴリは間違いなく私のヘルパーの一部を置き換えることができます!とにかく、もう一度ありがとう! –

0

これらはマクロなので、使用するたびに実際に[NSUserDefaults standardUserDefaults]と入力した場合と同じです。したがって、プレフィックスヘッダーが実際にシングルトンを作成していないため、シングルトンを存続させる危険はありません。

私はそれが悪い習慣であるとは言いません。私は前にそれをやった。しかし、pDelTESTAppDelegate.hに入れるなどして、これらの定義をクラスヘッダーそのものに入れる代わりに、#import TESTAppDelegate.hを使用できるようにすることをおすすめします。プレフィックスヘッダーにたくさんのヘッダーがないと(おそらくすべてのファイルにインポートされるため)、プログラムのコンパイルが速くなります。#import

関連する問題