Я написал этот простой метод действия, связанный с текстовым полем.
Каждый раз, когда я вводю текст в текстовое поле, выполняется поиск в PDF-файле и PDFView
автоматически прокручивается до выбора:
- (IBAction) search:(id)id
{
NSString *query = [self.searchView stringValue]; // get from textfield
selection = [document findString: query fromSelection:NULL withOptions:NSCaseInsensitiveSearch];
if (selection != nil)
{
[self.pdfView setCurrentSelection:selection];
[self.pdfView scrollSelectionToVisible:self.searchView];
}
}
Проблема в том, что после 3 или 4 поисков я получаю EXC_BAD_ACCESS
в строке (i).
Если я отлаживаю, я вижу, что запрос содержит NSCFString
, а не NSString
.
Я думаю, что этопроблема управления памятью .. а где?
Я повторил ту же проблему в тривиальном тестовом примере:
@interface PDFRef_protoTests : SenTestCase {
@private
PDFDocument *document;
}
........
- (void)setUp
{
[super setUp];
document = [[PDFDocument alloc] initWithURL: @"a local url ..."];
}
- (void)test_exc_bad_access_in_pdfdocument
{
for (int i =0 ;i<100; i++)
{
NSString *temp;
if (i % 2 == 0) temp = @"home";
else if (i % 3 ==0) temp = @"cocoa";
else temp=@"apple";
PDFSelection *selection = [document findString: temp
fromSelection:nil
withOptions:NSCaseInsensitiveSearch];
NSLog(@"Find=%@, iteration=%d", selection, i);
}
}
Обновление :
1)Кажется, что это происходит также, если я использую асинхронный поиск (метод beginFindString: withOptions) каждый раз, когда я выполняю второй поиск.
2) Я обнаружил аналогичную проблему с моей в MacRuby Отслеживание проблем: http://www.macruby.org/trac/ticket/1029
3) Кажется, что если я временно отключаю сборку мусора, она работает, но память увеличивается.Я написал что-то вроде:
[[NSGarbageCollector defaultCollector] disable];
[[NSGarbageCollector defaultCollector] enable];
окружающий поисковый код
Еще одно обновление
Очень странно то, что иногда все работает.Чем я чищу и перестраиваю и проблема возникает снова.С определенной точки зрения это не на 100% воспроизводимо.Я подозреваю ошибку в PDFKit или некоторые настройки компилятора, которые мне нужно сделать
Обновление снова
Уважаемые, это кажется очень сумасшедшим.Я бы сконцентрировался на тестовом примере, который очень тривиален и легко воспроизводит проблему.Что с этим не так?Этот тестовый сценарий работает, только если я отключаю (по коду или по настройкам проекта) GC
Другое обновление
Мальчики, похоже, это ошибка, но я скачал пример с названием PDFLinker из Appleвеб-сайт (http://developer.apple.com/library/mac/#samplecode/PDFKitLinker2/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003594). В этом примере реализован PDFViewer. Код моего приложения и этот пример очень похожи. Для одного и того же поискового действия в том же PDF моя память увеличивается на 300/400 МБ, а PDFLinker - на 190 МБ.что-то не так в моем коде. Но я сравниваю это постепенно, и я не думаю, что я вставляю утечки памяти (и прибор не дает мне никаких доказательств). Может быть, есть какие-то настройки для всего проекта?
Обновление пока что Уменьшено переключение с 64-битного на 32-битное потребление памяти. Конечно, есть проблема с 64-битным и PDFKit. Кстати, EXC_BAD_ACCESS при втором поиске
РЕШЕНИЕ Важным моментом является то, что PDFKit с сборкой мусора содержит ошибки. Если я отключаю GC, все работает правильно. У меня была другая проблема, которая усложнила мой анализ:Я отключил GC в настройках проекта, но GC остался включенным в настройках цели.Так что пример Apple PDFLinked2 работал, а мой нет.