gpt4 book ai didi

objective-c - 一个简单的 PDFKit 程序中奇怪的 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 16:25:21 25 4
gpt4 key购买 nike

我编写了这个与文本字段关联的简单操作方法。
每次我在文本字段中输入文本时,都会在 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 次搜索后,我在第 (i) 行得到 EXC_BAD_ACCESS
如果我调试,我会看到查询包含 NSCFString 而不是 NSString
我认为这是一个内存管理问题......但在哪里?

enter image description here

我在一个简单的测试用例中复制了相同的问题:

  @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 Issue Tracking 中发现了与我类似的问题:http://www.macruby.org/trac/ticket/1029

3)看来,如果我暂时禁用垃圾收集,它会起作用,但内存会增加。我写了这样的内容:

[[NSGarbageCollector defaultCollector] disable];
[[NSGarbageCollector defaultCollector] enable];

周围搜索代码

另一更新

非常奇怪的是,有时一切都有效。然后我清理并重建,问题又出现了。从某种角度来看并不是100%可重复的。我怀疑 PDFKit 中存在错误或我必须执行某些编译器设置

再次更新

亲爱的,这看起来很疯狂。我会专注于非常琐碎且很容易复制问题的测试用例。它出什么问题了?仅当我禁用(通过代码或项目设置)GC 时,此测试用例才有效

另一更新

天哪,这似乎是一个错误,但我从 Apple 网站 ( http://developer.apple.com/library/mac/#samplecode/PDFKitLinker2/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003594 ) 下载了一个名为 PDFLinker 的示例。此示例实现 PDFViewer。我的应用程序的代码和这个例子非常相似。对于相同 PDF 的相同搜索操作,我的内存增加到 300/400 MB,而 PDFLinker 增加到 190 MB。显然我的代码有问题。但我正在一点一点地比较它,我不认为我插入了内存泄漏(并且 Instrument 没有给我任何证据)。也许有一些项目范围的设置?

尚未更新从 64 位更改为 32 位内存消耗降低。 64位和PDFKit肯定有问题。顺便说一句,第二次搜索时仍然是 EXC_BAD_ACCESS

解决方案关键的一点是带有垃圾收集功能的 PDFKit 存在缺陷。如果我禁用 GC,一切都会正常工作。我遇到了另一个使我的分析变得复杂的问题:我在项目设置上禁用了 GC,但在目标设置上仍然启用了 GC。所以Apple 的示例PDFLinked2 有效,而我的则无效。

最佳答案

我同意您在 PDFKit 中发现了一个错误。

运行您的测试用例时,我遇到了各种形式的错误(段错误、选择器不理解等)。将代码包装在 @try/@catch 中并不能防止与此方法相关的所有错误。

我在打印日志消息时也遇到错误。

要解决该错误,我建议您在调用 -findString:fromSelection: 期间禁用 GC,正如您已经发现的那样。

此外,请务必在重新启用 GC 之前复制选择中感兴趣的值。也不要只是复制选择

如果您从代码中的多个位置进行搜索,我还建议您提取一个单独的方法来执行搜索。然后您可以调用该搜索来为您进行搜索,而无需重复 GC 禁用/启用嵌套。

关于objective-c - 一个简单的 PDFKit 程序中奇怪的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6316476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com