私は、テキストフィールドに関連付けられたこの些細なアクションメソッドを作成しました。
テキストフィールドにテキストを入力するたびに、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)2回目の検索を実行するたびに、非同期検索(メソッドbeginFindString:withOptions)を使用した場合にも発生するようです。
2)MacRuby Issue Trackingで私のものと同様の問題を見つけました:http://www.macruby.org/trac/ticket/1029
3)一時的にガベージコレクションを無効にすると、動作するように見えますが、メモリが増加します。私は次のようなものを書きました:
[[NSGarbageCollector defaultCollector] disable];
[[NSGarbageCollector defaultCollector] enable];
周囲の検索コード
別の更新
非常に奇妙なことは、すべてが機能することもあるということです。私が掃除して再構築するよりも、問題が再び発生します。ある観点からは、100%再現性はありません。PDFKitまたは私がしなければならないいくつかのコンパイラ設定のバグが疑われます
再度更新する
親愛なる、それは非常にクレイジーに見えます。私は非常に些細で問題を簡単に再現するテストケースに集中したいと思います。どうしたの?このテストケースは、GCを(コードまたはプロジェクト設定によって)無効にした場合にのみ機能します
別の更新
バグのようですが、AppleのWebサイト( http://developer.apple.com/library/mac/#samplecode/PDFKitLinker2/Introduction/Intro.html#//apple_ref/doc/uid/DTS10003594)からPDFLinkerという例をダウンロードしました。)。この例では、PDFViewerを実装しています。私のアプリのコードとこの例は非常に似ています。同じPDFで同じ検索アクションを実行すると、メモリは300/400 MBで増加し、PDFLinkerは190MBで増加します。明らかに私のコードに何か問題があります。しかし、私はそれを少しずつ比較していて、メモリリークを挿入しているとは思いません(そしてInstrumentは私に証拠を与えません)。たぶん、プロジェクト全体の設定はありますか?
更新はまだ 64ビットから32ビットへの変更メモリ消費量が減少しました。確かに64ビットとPDFKitには問題があります。ところで、2回目の検索でもEXC_BAD_ACCESS
解決 策重要な点は、ガベージコレクションを含むPDFKitにバグがあることです。GCを無効にすると、すべて正しく機能します。分析を複雑にする別の問題がありました。プロジェクト設定でGCを無効にしましたが、ターゲット設定でGCを有効のままにしました。したがって、Appleの例のPDFLinked2は機能しましたが、私の例では機能しませんでした。