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...


我就这个问题联系了 Apple 开发者技术支持,他们让我将此注册为错误。所以我做了一个错误报告,我正在等待答案。任何消息我都会编辑这篇文章。

4

2 回答 2

0

我在 iOS 7.1 中按照相同的步骤操作,问题不再出现。

当我将其作为错误报告给 Apple 时,他们回答说可能已在 iOS7 中解决。但直到现在我才有时间再次测试这个。

于 2014-03-13T18:22:24.307 回答
0

奇怪的!

我能够复制您的问题。如果将 stop 设置为 YES,看起来 enumerateTagsInRange 仍然会枚举所有剩余句子的第一个单词!

解决该问题的一种方法是将调用 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 回答