0

私はNSLinguisticTaggerオブジェクトを使用しており、彼のメソッドenumerateTagsInRange:scheme:options:usingBlockを使用しています。

問題は、長い文字列で改行なしで使用している場合、ブロックを停止できないことです。

文字列とNSLinguisticTaggerを開始するための私のコードは次のとおりです。

NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeTokenType]
                                                                    options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace];

[tagger setString:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."];

[tagger enumerateTagsInRange:NSMakeRange(0, [tagger.string length])
                      scheme:NSLinguisticTagSchemeTokenType
                     options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace
                  usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){

                       NSString *word = [tagger.string substringWithRange:tokenRange];

                       if ([word compare:@"lamet" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
                            *stop = YES;
                       }
                  }
];

私が期待したのは、* stop = YESを設定した後、ブロックがループを停止することです。しかし、これは起こっていません。ブロックは別の文にジャンプしますが、停止しません。文字列の最後に改行(\ n)がある場合、ブロックは予想どおりに停止します(同じコードで)。ただし、文字列に改行があると、ブロックによってメモリリークが発生します。

誰もが何が起こっているのか、そして私が期待していた仕事をブロックするために何ができるのかを知っていますか?

string enumerateSubstringsInRange:options:usingBlock:のメソッドは、実際のソリューションでは問題を解決しません...NSLinguisticTaggerを使用したい...


この問題についてAppleDeveloperテクニカルサポートに連絡したところ、バグとして登録するように指示されました。そこでバグレポートを作成し、回答を待っています。この投稿を編集するニュースがあります。

4

2 に答える 2

0

変!

私はあなたの問題を再現することができました。stopをYESに設定した場合、enumerateTagsInRangeは、残りの文の最初の単語を引き続き列挙しているように見えます。

この問題を回避する1つの方法は、enumerateTagsInRangeの呼び出しを次のように変更することです。

[tagger enumerateTagsInRange:NSMakeRange(0, [tagger.string length])
                      scheme:NSLinguisticTagSchemeTokenType
                     options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace
                  usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){

    if (*stop == NO) { // Only deal with the word if stop if not set to YES
        NSString *word = [tagger.string substringWithRange:tokenRange];

        if ([word compare:@"lamet" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
            *stop = YES;
        }
    }
}];

追加されたifステートメントを参照してください。

于 2013-03-26T19:53:06.460 に答える
0

iOS 7.1でも同じ手順を実行しましたが、問題は発生しなくなりました。

私がそれをバグとしてAppleに報告したとき、彼らはiOS7で解決されたかもしれないと答えた。しかし、今だけ私はこれを再びテストする時間がありました。

于 2014-03-13T18:22:24.307 に答える