IOS - Модальный UIView теряет делегат после предупреждения памяти - PullRequest
0 голосов
/ 14 февраля 2012

Я почти закончил свое приложение для iPhone, и я делаю тест, используя XCode 4 и IOS Simulator. Мое приложение имеет открытую модальную серию просмотров:

Вид 1 -> модальный -> Вид 2 -> модальный -> Вид 3 -> модальный -> Вид 4

Представление 2 является делегатом Представления 3, а Представление 3 - делегатом Представления 4.

Если View4 виден и я пытаюсь «имитировать предупреждение о памяти», я могу вернуться к View3, но View3 не может вызвать его делегат ([self.delegate NotifySave:self]).

Если я ставлю точку останова до вызова делегата, я вижу "0x0" вместо "0xsomething". Даже если я «выйду» из приложения с помощью кнопки «домой», проблема (конечно) все еще остается, когда я снова запускаю приложение.

Вопросы:

  • Кто-то еще испытывал ту же проблему?
  • Может ли эта проблема существовать только с симулятором? (Я не могу воспроизвести предупреждение на реальном iPhone)
  • У кого-нибудь были предложения?
  • Можно ли запретить выпуск View2? (Я думаю, что это является причиной проблемы)

Спасибо всем за помощь.

1 Ответ

2 голосов
/ 14 февраля 2012

Если вы сохраняете делегата через свойство obj-c 2.0, попробуйте изменить модель, чтобы полагаться на retain вместо assign.Это гарантирует, что делегат не будет выпущен из-под вас в таких ситуациях.Если вы идете по этому маршруту, важно убедиться, что у вас нет «удерживающего круга», в котором два объекта сохраняют друг друга и никогда не освобождаются.

@property (nonatomic, retain) id delegate;

Для создания фона вам следует разработать системув ней хранится информация, необходимая для восстановления состояния вашего приложения, затем очищается все эти элементы из памяти при выходе (в - (void)applicationDidEnterBackground:(UIApplication *)application) и восстанавливается при повторном запуске.Это предотвратит частую «очистку» вашего приложения, увеличивая вероятность того, что вы сможете восстановить при повторном запуске (в - (void)applicationWillEnterForeground:(UIApplication *)application), вместо того, чтобы ваше приложение каждый раз перезапускалось с квадрата 1.

...