Свойства и переменные экземпляра в Objective C

Используйте кэш, когда Вы хотите, чтобы объекты автоматически истекли или были исправлены, когда память недостаточна. Иначе используйте статические переменные, если Вы можете, потому что они приведут к лучшей производительности, тогда роющей через набор ApplicationState. Я не абсолютно уверен, что имело бы место, когда использовать ApplicationState, но, несомненно, будет некоторыми.

55
задан Steve Harrison 11 October 2009 в 11:28
поделиться

3 ответа

В мире iPhone нет сборщика мусора. Вам придется тщательно управлять памятью с подсчетом ссылок. Имея это в виду, рассмотрите разницу между:

name = @"Test";

и

self.name = @"Test";
// which is equivalent to:
[self setName: @"Test"];

. Если вы установите переменную экземпляра напрямую, без предварительного рассмотрения, вы потеряете ссылку на предыдущее значение и не сможете настроить ее счетчик сохранения (вы должен иметь выпуск d вручную). Если вы обращаетесь к нему через свойство, оно будет обрабатываться автоматически для вас, наряду с увеличением счетчика сохранения вновь назначенного объекта.

Фундаментальная концепция не зависит от iPhone, но становится критически важной в среде без сборщика мусора. .

29
ответ дан 7 November 2019 в 07:31
поделиться

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

Вы можете реализовать те же аксессоры вручную.

Вы можете найти в книге Аарона Хиллегасса примеры 3 стратегии управления памятью для переменных-членов. Это назначить / скопировать / сохранить . Вы выбираете один из тех, которые требуются для данной переменной.

Я полагаю, вы понимаете управление памятью в Objective-c ...

Аксессоры скрывают сложность и различия в управлении памятью для каждой переменной.

Например:

name = @"Test"

- простое присвоение, name теперь содержит ссылку на NSString @ "Test" . Однако вы можете решить использовать копию или сохранить .

6
ответ дан 7 November 2019 в 07:31
поделиться

Однако в мире iPhone дела обстоят иначе. Люди объявляют свойства для каждой отдельной переменной экземпляра, объявляют свойства для IBOutlets и используют аксессоры / мутаторы для взаимодействия с переменными экземпляра внутри класса (например, они могут написать [self setName: @ "Test"] , а не name = @ "Test" ).

Это не относится к iPhone. За исключением методов init и метода dealloc , рекомендуется всегда использовать ваши методы доступа. Основное преимущество, особенно на Mac (с привязками какао), заключается в том, что использование ваших аксессуаров означает бесплатные уведомления KVO.

Причина, по которой люди «объявляют свойства для каждой отдельной переменной экземпляра», скорее всего, заключается в том, что все их переменные экземпляра - это вещи, которые они хотят раскрыть как свойства. Если бы у них было что-то, что они хотели бы сохранить в тайне, они бы не объявляли свойство для этого в файле заголовка. (Однако они могут создать для него свойство в расширении класса в файле реализации, чтобы получать вышеупомянутые бесплатные уведомления KVO.)

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

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

На мой взгляд, объявление свойств для выходов является излишним. Я не вижу в этом смысла. Если вы не создадите свойство, загрузчик пера установит выход прямым доступом к переменной экземпляра, что вполне подходит для этой задачи.

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

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

3
ответ дан 7 November 2019 в 07:31
поделиться