Почему я отказываю после того, как MKMapView освобожден, если я больше не использую его?

У меня есть a MKMapView. Иногда после того, как мой контроллер представления отклонен, я получу a EXC_BAD_ACCESS.

Я включил NSSZombies и это похоже MKMapViewделегат — мой контроллер представления! — называется, несмотря на обоих MKMapView и UIViewController подкласс освобожден. Я проверил, и мое управление памятью корректно.

Что продолжается?

24
задан Steven Fisher 2 February 2010 в 22:19
поделиться

1 ответ

Самое близкое, что я могу получить:

>>> [match.groupdict() for match in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk')]
[{'i': None, 'b': 'abc'}, {'i': 'hij', 'b': None}]

Как вы объединяете словари, то зависит от того, ожидаете ли вы более одного совпадения. Если требуется только одно совпадение, можно выполнить следующие действия:

>>> results = {}
>>> for match in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk'):
...     results.update(dict((k,v) for k, v in match.groupdict().iteritems() if v is not None))
... 
>>> results
{'i': 'hij', 'b': 'abc'}

Или для нескольких совпадений:

>>> results = defaultdict(lambda: [])
>>> for match in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijkabcdefghijk'):
...     for k, v in match.groupdict().iteritems():
...         if v is not None:
...             results[k].append(v)
... 
>>> results
defaultdict(<function <lambda> at 0x7f53d0992c08>, {'i': ['hij', 'hij'], 'b': ['abc', 'abc']})
-121--4518442-

Для кода сервера, т. е. для конечных точек, как обычно. для xap, я думаю, у вас есть несколько вариантов в зависимости от того, как вы управляете коммуникациями. Возможно, запрос содержит номер версии, и если сервер был обновлен, принудительно загрузите какой-либо код для перезагрузки клиента, битовый lame, грязный, но выполнимый. Возможно, более чистым решением было бы управление сеансом клиентов, который, предположительно, является частью и посылкой с запросами в заднюю часть. При развертывании новой версии сеанс клиента может стать недействительным, что, возможно, приведет к обновлению страницы с помощью пользовательской логики. Если ваш протокол является push base вы можете отправить команду клиенту, чтобы сделать то, что вы хотите, для многих систем, которые находятся в течение всего дня его вероятность того, что эта инфраструктура будет существовать (если вы создали его красиво:)). Например, наш уровень обслуживания абстрагирован от моделей репозиториев и моделей просмотра, в нашем случае мы могли бы отправить выход из системы или, возможно, конкретную команду, чтобы ввести на клиенте некоторую пользовательскую логику, информирующую об обновлении приложения и обновить ваш браузер, когда это будет сделано. Наша оболочка легкая, поэтому наши модули (в основном другие xap) могут быть обновлены во время обновления.

-121--3753605-

Это связано с работой пути MKMapView . Ожидается операция, поэтому MapKit сохраняет MKMapView , и фактически он еще не был удален. Это сама по себе не проблема. Проблема в том, что он по-прежнему отправляет сообщения делегату.

Обходной путь прост: В рамках очистки контроллера вида установите делегат представления карты на nil , что не позволит MKMapView отправлять ему сообщения.

Это задокументировано в Ссылка на протокол MKMapViewDelegate :

Перед освобождением объекта MKMapView, для которого задан делегат, не забудьте установить для свойства делегата этого объекта значение nil. Одно место, где это можно сделать, - это метод dealloc, в котором используется вид карты.

Отредактируйте: Дайте Оскару преимущество, а также чуть ниже, который предоставил здесь цитату из документации.

Учитывая ARC, я предлагаю установить делегат представления карты на nil в dealloc контроллера представления.

44
ответ дан 28 November 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: