1

プロジェクトを分析すると、次のコードでリーク警告が表示されます。メモリリークの問題を解決する方法はありますか?

警告 :

Potential leak of an object allocated on line 38 and stored into 'addressBook'

ベローは私のコードです。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    m_tableDataArray = [[[NSMutableArray alloc] init]autorelease];
    NSMutableArray *listDate = [[[NSMutableArray alloc] init]autorelease];
    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSArray *addresses = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);
    NSInteger addressesCount = [addresses count];
    for (int i = 0; i < addressesCount; i++) {
        ABRecordRef record = [addresses objectAtIndex:i];
        NSString *firstName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
        NSString *lastName = (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);
        if(firstName != nil && lastName != nil){
            NSString *contactFirstLast = [NSString stringWithFormat: @"%@ %@", firstName, lastName];
            [listDate addObject:contactFirstLast];
        }
        [firstName release];
        [lastName release];
    }
    m_tableDataArray = [[NSArray arrayWithArray:listDate] retain];
    [addresses release];
    addresses = nil;
    [m_mainTable reloadData];
}

事前に感謝します...

4

1 に答える 1

6

使用を終了しaddressBookたら、次を使用してリリースする必要があります。

CFRelease(addressBook);

これはおそらくviewWillAppear:メソッドの最後に配置する必要があります。

更新:のバージョンには、不要な配列と手順がいくつかありますviewWillAppear:。私はそれを少しクリーンアップし、潜在的なメモリリークを修正しました。

注:私は実際にこれを実行したことがないので、正しく機能することを再確認してください。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // I assume m_tableDataArray is an instance variable.  If so, if the 
    // view appears multiple times it will result in a leak unless we 
    // release pre-existing instances first.

    [m_tableDataArray release], m_tableDataArray = nil;
    m_tableDataArray = [[NSMutableArray alloc] init];

    ABAddressBookRef addressBook = ABAddressBookCreate();

    NSArray *addresses = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

    for (ABRecordRef record in addresses) {
        NSString *firstName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
        NSString *lastName = (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);

        if(firstName != nil && lastName != nil){
            NSString *contactFirstLast = [NSString stringWithFormat: @"%@ %@", firstName, lastName];
            [m_tableDataArray addObject:contactFirstLast];
        }

        [firstName release];
        [lastName release];
    }

    [addresses release], addresses = nil;
    CFRelease(addressBook);

    [m_mainTable reloadData];
}
于 2012-04-09T05:10:35.017 に答える