Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用ABAddressBook和ABRecordRef时内存泄漏_Ios_Objective C_Memory Leaks_Abaddressbook - Fatal编程技术网

Ios 使用ABAddressBook和ABRecordRef时内存泄漏

Ios 使用ABAddressBook和ABRecordRef时内存泄漏,ios,objective-c,memory-leaks,abaddressbook,Ios,Objective C,Memory Leaks,Abaddressbook,我尝试从地址簿中加载一些特定联系人,并将ABRecordRef存储到一个可变的字典数组中。我使用ARC,以下是我的方法: - (ABRecordRef) findContactsMatchingFullName:(NSString *)contactFullName { ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL); NSArray *allRecords = CFBridgingRelease(

我尝试从地址簿中加载一些特定联系人,并将ABRecordRef存储到一个可变的字典数组中。我使用ARC,以下是我的方法:

- (ABRecordRef) findContactsMatchingFullName:(NSString *)contactFullName
{
    ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL);
    NSArray *allRecords = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(ab));
    NSCharacterSet *space = [NSCharacterSet whitespaceCharacterSet];
    NSMutableArray *contactsMutableArray = [NSMutableArray array];
    NSDictionary *contact;

    NSUInteger numberOfContacts = allRecords.count;
    for (int i = 0; i < numberOfContacts; i++)
    {
        ABRecordRef record = (__bridge ABRecordRef)(allRecords[i]);
        NSString *fname = ( NSString *)CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
        NSString *lname = ( NSString *)CFBridgingRelease(ABRecordCopyValue(record, kABPersonLastNameProperty));
        NSString *mname = ( NSString *)CFBridgingRelease(ABRecordCopyValue(record, kABPersonMiddleNameProperty));
        NSString *organization = ( NSString *)CFBridgingRelease(ABRecordCopyValue(record, kABPersonOrganizationProperty));

        if (fname || lname || mname || organization)
        {
            if (!fname) fname = @"";
            if (!lname) lname = @"";
            if (!mname) mname = @"";
            if (!organization) organization = @"";
            NSString *fullName = [[[[fname stringByAppendingFormat:@" %@", mname] stringByTrimmingCharactersInSet:space] stringByAppendingFormat:@" %@", lname] stringByTrimmingCharactersInSet:space];


            contact = [[NSDictionary alloc] initWithObjectsAndKeys:
                       (__bridge id)record, ksABRecordRef,
                       fullName, ksFullName,
                       organization, ksOrganization,
                       nil];
            [contactsMutableArray addObject:contact];
        }
    }

    if (ab) CFRelease(ab);



NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE[CD] %@ OR %K LIKE[CD] %@",
                          ksFullName, contactFullName, ksOrganization, contactFullName];


NSArray *filteredArray = [contactsMutableArray filteredArrayUsingPredicate:predicate];

if (filteredArray.count == 1)
    return (__bridge ABRecordRef)([filteredArray[0] objectForKey:ksABRecordRef]);
else
    return nil;
}

- (void)loadContacts:(NSArray*)contactNames
{
    if (!_contacts)
        _contacts = [[NSMutableArray alloc] init];
    else
        [_contacts removeAllObjects];

    for (NSString* name in contactNames)
    {        
        ABRecordRef contactRecord = [self findContactsMatchingFullName:name]; contacts

        if (contactRecord)
            [_contacts addObject:(__bridge id)contactRecord];
    }
}

CFBrigingRelease不应该保留
abAddressBookCopyArrayFallPeople的计数吗?

是的,应该保留。-您是否尝试过Xcode“Analyze”选项?您确定这是内存泄漏吗?可能是ARC logic稍后会释放内存分配。@Visput是内存分配,但不会在任何时候释放,并且每次调用loadContacts方法时,分配都会大幅增加amount@MartinR是的,根本没有来自Xcode Analyze的消息。在源代码编辑器中写入
@autoreleasepool{}
。你会感到惊讶的。
NSArray *allRecords = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(ab));