2011-08-02 24 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方法,而不是最有效的方法......在開始時調用一次,保存它在一個變量中,並使用它直到最後,似乎更有效率。第二個問題,需要的記憶警告/問題以及你的單身模板將會很好。 – lm2s

+1

「(我討厭一次又一次地寫同樣的代碼),所以我喜歡做一個單例,並在任何地方使用它。」你在開玩笑吧,對吧? – Caleb

+0

內存警告可能是由於有這麼多不同的單例實例浮動而引起的。除非您明確地將它們釋放到某個地方,否則一旦訪問它們將保留在內存中,直到應用程序存在。單身人士有時間和地點,你應該考慮你的設計模式對於低內存移動設備是否正確,在這些設備中,懶惰加載事件和完成時間釋放通常是首選。 – jdmunro

回答

0

有趣的方法。在預編譯頭文件中將這些作爲#define並不是問題 - 這確實使它們在任何地方都可用,並且正如jtbandes所說,它們只是在用法上調用,因此不存在內存問題。

它讓我覺得風格上有點愚蠢,你基本上是在創造全球性的「魔術」保留字,看起來他們可能是局部變量名。如果其他人正在閱讀你的代碼,他們不是特別的自我解釋。如果這樣做,我可能至少會用大寫字母來啓動它們,或者使它們全部大寫,以表示它們是定義/宏。

將這麼多應用程序頭文件拉入預編譯頭文件(通常非常精簡,並用於核心系統的東西),但在現代機器上對編譯時間的實際影響將完全可以忽略不計。


你爲什麼創建單例和記憶警告的陳述使我認爲你可能仍然在學習編程。在一個面向對象的世界中,單例對於封裝一個只存在一次的對象來說是很好的方式。如果你使用它們來避免「一遍又一遍地寫相同的代碼」,任何你需要的常規函數​​或方法都可以工作。對於「助手」,您應該查看「類別」,以便在那裏爲您提供一些提升。 Re:8個不同的單身人士。在您的應用程序運行的同時,無數對象同時共存,單身或其他情況。僅此一件事就不成問題 - 只要管理得當,他們就不會煩擾彼此。

+0

嗨quixoto,謝謝你的迴應。誠然,我對這個客觀世界還是個新手。我學習了4年Java/Matlab,但是在一年前開始了iPhone/iPad編程。我喜歡這門語言,但我仍然在學習我猜想的最佳設計模式。這裏的答案讓我相信前綴頭文件不是問題,但是所有單身人士都可能同時存在。我想我應該回去看看我是否真的需要一些單身人士,類別絕對可以取代我的一些幫手!無論如何,再次感謝! –

0

因爲這些都是宏,所以無論何時使用它們,就好像您實際上鍵入了[NSUserDefaults standardUserDefaults]或其他任何其他類型,因此沒有保留更多單例的風險,因爲前綴頭並不實際創建單例。

我不會說這是不好的做法;我以前做過。但是,我可能會建議將這些定義放入類標題中,例如將pDel放在TESTAppDelegate.h中,這樣如果您使用#import TESTAppDelegate.h,則可以使用它。如果你在前綴頭文件中沒有#import大量的頭文件(因爲那些文件將被導入每個文件),它可能會讓你的程序編譯得更快。