Цель C - Вопрос управления памятью? - PullRequest
0 голосов
/ 16 сентября 2010

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

Object *o = [[Object alloc] init];
self.myObject = o;
[o release];

но что если я не определю свойство для myObject?

Могу ли я сделать следующее без утечки?

Лучше ли определять свойство для каждой переменной в каждом классе? Почему ??

myObject = [[Object alloc] init];

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

Да, вы можете установить переменную экземпляра таким образом, и это совершенно нормально - на самом деле, это предпочтительный способ сделать это в init методах (потому что сеттеры могут иметь побочные эффекты).Просто не забудьте освободить старый объект (если он есть) в переменной, прежде чем устанавливать новый, иначе произойдет утечка.И используете ли вы свойства или устанавливаете ivar напрямую, вам нужно освободить объект в dealloc.

1 голос
/ 16 сентября 2010

Потому что Иаков уже ответил на часть без собственности.Я отвечу слева

Могу ли я сделать следующее без утечки?

myObject = [[Object alloc] init];

У вас естьчтобы выпустить myObject где-нибудь, может быть, в методе делегата, или, возможно, после того, как вы закончили его использовать, но не забудьте освободить объект, особенно, прежде чем вы потеряете ссылку на объект

Лучше лиопределить свойство для каждой переменной у меня в каждом классе?Почему ??

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

1 голос
/ 16 сентября 2010

Вам не нужно , чтобы иметь какие-либо свойства.В Obj-C их вообще не было, пока пару лет назад с Obj-C 2. Свойства были удобны - они дают вам некоторое управление памятью без написания шаблонного кода (методы доступа синтезированы для вас), иВы можете использовать точечную нотацию, с которой некоторые люди знакомы больше, чем обычный синтаксис Obj-C.

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

Большим преимуществом является то, что свойства обрабатывают подсчет ссылок для вас при назначении объектов из одного места в другое.,Вам не нужно писать геттеры и сеттеры вручную.По этой причине мне нравятся свойства.Кроме того, clang получает возможность иметь свойства, в которых вам нужна только строка @property, нет необходимости в вспомогательной переменной и нет необходимости в строке @synthesize.Однострочные свойства - это победа в моей книге.(ОК, две строки, вам нужно добавить строку и в dealloc:)

1 голос
/ 16 сентября 2010

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

Если вы не определили свойство для него, не используйте синтаксис точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...