Управление памятью с помощью ARC - проблема производительности - PullRequest
2 голосов
/ 06 ноября 2011

У меня есть несколько общих вопросов для начинающих, касающихся управления памятью с помощью ARC. У меня возникают проблемы с производительностью в приложении - как на устройстве, так и на симуляторе. Проблема с производительностью возникает только при запуске симулятора в режиме «сетчатки», поэтому я считаю, что у меня должна быть проблема с «памятью». Я также видел «предупреждение о получении памяти» в своем журнале, когда я тестировал приложение на своем устройстве.

Во-первых, когда я создаю UIImages для использования в подпредставлении, должен ли я установить для этого изображения значение nil после того, как я назначил его подвиду? Пример:

UIImage * image = [UIImage imageNamed:@"Image.png"];
UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:imageView];
// Should I set image && imageView to nil here?

Применимо ли это к другим локальным переменным и / или переменным экземпляра?

Во-вторых, каков правильный способ ARC для создания переменных экземпляра, который я сейчас использую,

UiView  * view;

// And implement it in @implementation
view = [[UIView alloc] initWithFrame:frame];

Любые рекомендации и советы будут оценены. Ссылки на хорошие ресурсы ARC также были бы хорошими.

Ответы [ 2 ]

4 голосов
/ 07 ноября 2011

Ваш код в порядке. Там нет проблем с управлением памятью там. Единственное, что может вызвать проблемы, это [UIImage imageNamed:], потому что он загружает загруженные изображения. Попробуйте использовать [[UIImage alloc] initWithContentsOfFile:] вместо.

Вы можете найти хорошую статью о ARC здесь

2 голосов
/ 07 ноября 2011

Оба вопроса, связанные с ARC, у вас в порядке. Вам не нужно вручную устанавливать какие-либо переменные в ноль; они будут автоматически установлены в ноль, когда они выйдут из области видимости. ARC выясняет, как сохранить / освободить переменные экземпляра, поэтому в этом нет необходимости делать что-то особенное.

Как вы упомянули, проблема возникает, когда вы запускаете свое приложение на сетчатке. Учитывая, что ваш код тесно связан с изображениями, я подозреваю, что проблема связана с изображениями. Может случиться так, что Image.png имеет высокое разрешение и устройство сетчатки размещено таким образом, что использует много памяти.

Предлагаю попробовать:

  • a) вызов initWithFrame: в представлении изображения и последующий вызов setImage:, таким образом представление изображения не будет изменено или странно обработано из-за странного UIImage поведения сетчатки.
  • b) измените размер ресурса вручную, Image.png, чтобы он был меньше. Это можно сделать с помощью любого обычного графического редактора, например Preview.
...