NSLinguisticTagger Утечка памяти - PullRequest
3 голосов
/ 03 января 2012

Я возился в Xcode 4.2 с новым NSLinguisticTagger в iOS 5.0.Моя цель с этой функцией - взять запись адресной книги, а затем выдать составное имя как NSString, что-то вроде того, что делает ABRecordCopyCompositeName, но с учетом порядка именования для восточноазиатских языков и венгерского (последний сначала вместо первого).Вот функция:

NSString *text = [self getLocalizedFullNameOfRecord:[contacts objectAtIndex:indexPath.section];


- (NSString *) getLocalizedFullNameOfRecord:(ABRecordRef) person
{
    NSString *firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *middleName = ABRecordCopyValue(person, kABPersonMiddleNameProperty);
    NSString *lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSString *prefix = ABRecordCopyValue(person, kABPersonPrefixProperty);
    NSString *suffix = ABRecordCopyValue(person, kABPersonSuffixProperty);
    NSString *fullName = @"";

    __block BOOL Asian;
    // Apologies to all Hungarians who aren't actually Asian
    __block NSArray *asianLanguages = [NSArray arrayWithObjects:@"zh-Hant", @"zh-Hans", @"ja", @"ko", @"hu", @"vi", nil];

    [firstName enumerateLinguisticTagsInRange:NSMakeRange(0, firstName.length) scheme: NSLinguisticTagSchemeLanguage options: NSLinguisticTaggerOmitWhitespace orthography: nil usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){
        if ([asianLanguages containsObject:tag])
            Asian = YES;
        else
            Asian = NO;
    }];

    if(prefix)
        fullName = [fullName stringByAppendingFormat:@"%@ ", prefix];
    if(Asian && lastName)
        fullName = [fullName stringByAppendingFormat:@"%@ ", lastName];
    else if(firstName)
        fullName = [fullName stringByAppendingFormat:@"%@ ", firstName];
    if(middleName)
        fullName = [fullName stringByAppendingFormat:@"%@ ", middleName];
    if(Asian && firstName)
        fullName = [fullName stringByAppendingFormat:@"%@ ", firstName];
    else if(lastName)
        fullName = [fullName stringByAppendingFormat:@"%@ ", lastName];
    if(suffix)
        fullName = [fullName stringByAppendingFormat:@"%@", suffix];

    [firstName release];
    [middleName release];
    [lastName release];
    [prefix release];
    [suffix release];

    return fullName;
}

Инструменты говорят мне, что я пропускаю примерно 16-32 байта при каждой итерации этой функции в enumerateLinguisticTagger (а не в части блоков, по-видимому).Так как онлайн-ресурсы для NSLinguisticTagger ограничены ссылкой на класс и одним учебником, я понятия не имею, где и как начать искать утечку.

Помогите пожалуйста?

1 Ответ

0 голосов
/ 25 марта 2013

У меня была такая же проблема. В моем случае, утечки произошли, когда строка имеет разрывы строки (\ n или \ r).

...