2012-01-03 10 views
3

私はXcode 4.2でiOS 5.0の新しいNSLinguisticTaggerを使っています。この関数の私の目的は、アドレス帳のレコードを取り込み、NSStringとしてABRecordCopyCompositeNameのような種類の複合名を吐き出すことですが、東アジア言語とハンガリー語の命名順序を考慮に入れています(最初の最後)。ここでは機能があります:NSLinguisticTaggerメモリリーク

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; 
} 

インスツルメンツは、私は(明らかではなく、ブロックの一部)enumerateLinguisticTaggerに、この機能の反復ごとにいくつかの16〜32バイトをリークしていますと言われます。 NSLinguisticTaggerのオンラインリソースはクラス参照と単一のチュートリアルに限られているため、どこでどのように漏れを探し始めるか分かりません。

助けてください?

+0

+1便利なコードです。私はこれを見ていて(http://www.w3.org/International/questions/qa-personal-names)、どうやってそれをやっているのだろうと思っていました、そして、ヘイ・プレスト、救出へのセレンディピティ:-) –

答えて

0

私は同じ問題を抱えていました。私の場合、文字列に改行(\ nまたは\ r)があるとリークが発生しました。