iOS возможные проблемы с памятью синглетами в заголовке префикса - PullRequest
0 голосов
/ 02 августа 2011

Я использую много синглетонов, я настроил много, так как я называю их «одноэлементными фреймворками».

Также мне нравится писать определение синглтона в префиксном заголовке моего проекта XCodeтак что я могу использовать все свои синглтоны в каждом классе, используя только одну строку кода!Для меня это похоже на рай, но я продолжаю замечать, что мне приходится иметь дело с предупреждениями памяти во всех моих приложениях.Так что мне было интересно, это как-то связано с размещением моих одноэлементных определений в заголовке префикса?Мне кажется, поскольку синглтон - это всего лишь один экземпляр, совершенно не имеет значения, положили вы его в заголовок префикса или нет.Возможно, дело в том, что одновременно существует 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. Могут ли проблемы с памятью быть вызваны этой частью заголовка префикса или это более вероятно, потому что много разных синглетов постоянно «живы»?

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Интересный подход. Это не проблема иметь их как #define s в предварительно скомпилированном заголовке - это делает их доступными везде, и, как говорит jtbandes, они в любом случае вызываются только при использовании, поэтому никаких проблем с памятью нет.

Мне стилистически кажется немного глупым, что вы по сути создаете глобальные "волшебные" зарезервированные слова, которые выглядят так, как будто они могут быть именами локальных переменных. Если другие читают ваш код, они не особенно говорят сами за себя. Если бы я это сделал, я бы, по крайней мере, начал их с заглавной буквы или сделал их заглавными, чтобы указать, что они являются определением / макросом.

Также немного странно вставлять так много заголовков приложений в предварительно скомпилированный заголовок (который обычно довольно скудный и используется для основной системы), но фактическое влияние на время компиляции здесь на современных машинах будет совершенно незначительным.


Ваши заявления о том, почему вы создаете синглтоны, и предупреждения памяти, заставляют меня думать, что вы все еще можете изучать программирование. Синглтоны - прекрасный способ в объектно-ориентированном мире инкапсулировать объект, который должен существовать только один раз. Если вы используете их как способ избежать «написания одного и того же кода снова и снова», любая обычная функция или метод, где вам это нужно, также будет работать. Что касается «помощников», вы также должны посмотреть на «категории», которые могут помочь вам в этом. Re: 8 разных синглетонов. Миллионы объектов сосуществуют в одно и то же время, пока ваше приложение работает, в одиночном режиме и так далее. Это само по себе не проблема - они не беспокоят друг друга, если все они управляются правильно.

0 голосов
/ 02 августа 2011

Поскольку это макросы, всякий раз, когда вы их используете, это похоже на то, как если бы вы на самом деле набрали [NSUserDefaults standardUserDefaults] или любой другой, поэтому нет риска сохранить больше синглетонов в живых, потому что заголовок префикса фактически не создает синглтоны .

Я бы не сказал, что это плохая практика; Я делал это раньше. Тем не менее, я мог бы рекомендовать вместо этого помещать эти определения в сами заголовки классов, например помещать pDel в TESTAppDelegate.h, чтобы, если вы #import TESTAppDelegate.h, вы могли его использовать. Это, вероятно, ускорит компиляцию вашей программы, если у вас нет #import большого количества заголовков в заголовке префикса (потому что они будут импортированы для каждого файла).

...