Утечка памяти NSLinguisticTagger

Я возился в 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;
}

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

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


person Serendipity    schedule 03.01.2012    source источник
comment
+1 за полезный фрагмент кода. Я просматривал это (w3.org/International/questions/qa-personal- имена) и задавались вопросом, как я собирался это сделать, и, вуаля, Serendipity спешит на помощь :-)   -  person Robotic Cat    schedule 13.12.2012


Ответы (1)


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

person Yudmt    schedule 25.03.2013