开发者

When I Get into the addressbook twice , my project will crash

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
                            property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
if (property == kABPersonPhoneProperty) {
    ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhonePrope开发者_JS百科rty);
    for(CFIndex i = 0; i < ABMultiValueGetCount(multiPhones); i++) {
        if(identifier == ABMultiValueGetIdentifierAtIndex (multiPhones, i)) {
            CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);
            CFRelease(multiPhones);
            NSString *phoneNumber = (NSString *) phoneNumberRef;
            CFRelease(phoneNumberRef);
            RecipientContact *recipient = [[RecipientContact alloc] init];
            recipient.phoneNumber = [NSString stringWithFormat:@"%@", phoneNumber];
            recipient.name = nil;
            [recipients addObject:recipient];
            [recipient release];
            [phoneNumber release];
        }
    }
}
[self dismissModalViewControllerAnimated:YES];
[self _addRecipients];
return NO;
}

- (void)_addRecipients {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *names = [[NSString alloc] init];
for (RecipientContact *recipient in recipients) {
    names = [names stringByAppendingString:recipient.phoneNumber];
    names = [names stringByAppendingString:@";"];
}
contactsField.text = names;
[pool release];
}

I'm trying to use this code in my project ,but it'll crash when I go into the addressbook twice.I found when I CFRelease one of multiPhones and phoneNumberRef,it go well.But when I CFRelease both of them,the app will crash.

I have seen the Core Foundation Naming Conventions,it says "if a function name contains the word "Create" or "Copy", you own the object.",but why I release both of them my app crashed,thank you.


The problem is you are using toll free bridging and then releasing the NSString

        NSString *phoneNumber = (NSString *) phoneNumberRef;
        CFRelease(phoneNumberRef);
        ...
        [phoneNumber release]; //<-- this is like calling CFRelease(phoneNumberRef); again

Either call [phoneNumber retain] before CFRelease(phoneNumberRef); or just dont CFRelease the phoneNumberRef.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜