Кажется, что проблема, с которой вы столкнулись, связана с управлением памятью. Вы начинаете с поиска по строке self.formattedText
. Это означает, что во время этого поиска вашему экземпляру NSDataDetector
, вероятно, необходим доступ к строке для чтения символов и т. Д. Это работает отлично и хорошо, пока self.formattedText
не освобождается. Обычно, даже для блочных методов, подобных этому, вызывающая сторона несет ответственность за сохранение аргументов до конца вызова функции.
Когда внутри вашего найденного совпадения блока вы меняете значение self.formattedText
, старое значение автоматически освобождается (при условии, что это свойство retain
). Мне неизвестно о кешировании, которое может выполнять NSDataDetector, или о проблемах, связанных с пулами автоматического выпуска и т. Д., Но я почти уверен, что это может вызвать проблему.
Я предлагаю вам передать [NSString stringWithString:self.formattedText]
в качестве аргумента enumerateMatchesInString:
вместо простого self.formattedText
. Таким образом, вы передаете NSDataDetector экземпляр, который не будет освобожден до тех пор, пока не будет очищен пул автоматического выпуска.