Используйте кэш, когда Вы хотите, чтобы объекты автоматически истекли или были исправлены, когда память недостаточна. Иначе используйте статические переменные, если Вы можете, потому что они приведут к лучшей производительности, тогда роющей через набор ApplicationState. Я не абсолютно уверен, что имело бы место, когда использовать ApplicationState, но, несомненно, будет некоторыми.
В мире iPhone нет сборщика мусора. Вам придется тщательно управлять памятью с подсчетом ссылок. Имея это в виду, рассмотрите разницу между:
name = @"Test";
и
self.name = @"Test";
// which is equivalent to:
[self setName: @"Test"];
. Если вы установите переменную экземпляра напрямую, без предварительного рассмотрения, вы потеряете ссылку на предыдущее значение и не сможете настроить ее счетчик сохранения (вы должен иметь выпуск
d вручную). Если вы обращаетесь к нему через свойство, оно будет обрабатываться автоматически для вас, наряду с увеличением счетчика сохранения вновь назначенного объекта.
Фундаментальная концепция не зависит от iPhone, но становится критически важной в среде без сборщика мусора. .
Свойства используются для генерации аксессоров, например переменных экземпляра, никакой магии не происходит.
Вы можете реализовать те же аксессоры вручную.
Вы можете найти в книге Аарона Хиллегасса примеры 3 стратегии управления памятью для переменных-членов. Это назначить / скопировать / сохранить
. Вы выбираете один из тех, которые требуются для данной переменной.
Я полагаю, вы понимаете управление памятью в Objective-c ...
Аксессоры скрывают сложность и различия в управлении памятью для каждой переменной.
Например:
name = @"Test"
- простое присвоение, name
теперь содержит ссылку на NSString @ "Test"
. Однако вы можете решить использовать копию
или сохранить
.
Однако в мире iPhone дела обстоят иначе. Люди объявляют свойства для каждой отдельной переменной экземпляра, объявляют свойства для
IBOutlets
и используют аксессоры / мутаторы для взаимодействия с переменными экземпляра внутри класса (например, они могут написать[self setName: @ "Test"]
, а неname = @ "Test"
).
Это не относится к iPhone. За исключением методов init
и метода dealloc
, рекомендуется всегда использовать ваши методы доступа. Основное преимущество, особенно на Mac (с привязками какао), заключается в том, что использование ваших аксессуаров означает бесплатные уведомления KVO.
Причина, по которой люди «объявляют свойства для каждой отдельной переменной экземпляра», скорее всего, заключается в том, что все их переменные экземпляра - это вещи, которые они хотят раскрыть как свойства. Если бы у них было что-то, что они хотели бы сохранить в тайне, они бы не объявляли свойство для этого в файле заголовка. (Однако они могут создать для него свойство в расширении класса в файле реализации, чтобы получать вышеупомянутые бесплатные уведомления KVO.)
На мой взгляд, объявление свойств для выходов является излишним. Я не вижу в этом смысла. Если вы не создадите свойство, загрузчик пера установит выход с помощью прямого доступа к переменной экземпляра, что вполне подходит для этой задачи.
они могут создать для него свойство в расширении класса в файле реализации, чтобы получать вышеупомянутые бесплатные уведомления KVO.)На мой взгляд, объявление свойств для выходов является излишним. Я не вижу в этом смысла. Если вы не создадите свойство, загрузчик пера установит выход прямым доступом к переменной экземпляра, что вполне подходит для этой задачи.
они могут создать для него свойство в расширении класса в файле реализации, чтобы получать вышеупомянутые бесплатные уведомления KVO.)На мой взгляд, объявление свойств для выходов является излишним. Я не вижу в этом смысла. Если вы не создадите свойство, загрузчик пера установит выход с помощью прямого доступа к переменной экземпляра, что вполне подходит для этой задачи.