无法阻止NSLinguisticTagger的阻止

时间:2013-03-26 12:37:34

标签: ios objective-c-blocks

我正在使用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),那么块就像我预期的那样停止(使用相同的代码)。但是当字符串有换行符时,该块会导致内存泄漏。

任何人都知道发生了什么以及我可以尝试阻止我的工作?

字符串enumerateSubstringsInRange的方法:options:usingBlock:在我的实际解决方案中没有解决我的问题...我想使用NSLinguisticTagger ...


我与Apple Developer Technical Support联系过这个问题,他们让我将此注册为错误。所以我做了一个bug报告,我在等待回答。任何新闻我都会编辑这篇文章。

2 个答案:

答案 0 :(得分: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语句。

答案 1 :(得分:0)

我在iOS 7.1中执行了相同的步骤,问题不再发生。

当我向Apple报告这个错误时,他们回答说可能已经在iOS7中解决了。但是现在我才有时间再次测试它。