Странное поведение NSMutableDictionary - PullRequest
1 голос
/ 12 октября 2011

У меня есть приложение для iPhone с 4 элементами панели вкладок. Одним из них является карта. Я получаю текущее местоположение пользователя и вычисляю расстояние от пользователя до некоторых мест по всему городу. Я храню координаты для этих мест и расстояний в NSMutableDictionary.

distanceDic = [[NSMutableDictionary alloc]initWithObjects:coordinates forKeys:distance];

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

Я поставил NSLog с количеством ключей в словаре в

-(void)viewDidDisappear:(BOOL)animated

Этот метод вызывается как при нажатии кнопки «Список» на панели навигации, так и при переходе на другую вкладку. При нажатии кнопки «Список» отображается правильное количество клавиш, но при переходе на другую вкладку отображается 0.

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

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Поместите точку останова в ваш метод dealloc, где этот словарь будет выпущен.Фактически, ставьте точку останова везде, где этот словарь выпускается.Просто найдите distanceDic и release, операторы "self.distanceDic = nil" или [self setDistanceDic: nil].Затем запустите вашу программу и посмотрите, какая точка останова была достигнута.Тогда у тебя будет ответ.Я подозреваю, что вы определили его как @property (nonatomic, retain) и что он либо выбрасывается, когда вы нажимаете на панель вкладок и переходите к новому контроллеру, либо он загружает новый, и вы 'смотрите на выпущенный.

0 голосов
/ 12 октября 2011

Одним из возможных объяснений является то, что представление выгружается из-за предупреждения о нехватке памяти, а затем перезагружается при следующем переходе на его вкладку. -viewDidLoad будет вызван снова, и в зависимости от вашей реализации это может привести к потере всего состояния вашего представления.

...