Ios 使用CFRelease时应用程序崩溃

Ios 使用CFRelease时应用程序崩溃,ios,iphone,xcode,Ios,Iphone,Xcode,我试图理解我应该如何使用CFRelease。我想我用得不对。当我试图发布时,应用程序崩溃 if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")){ //get phone numbers ABMultiValueRef emails = ABRecordCopyValue((__bridge ABRecordRef)person,kABPersonEmailProperty);

我试图理解我应该如何使用CFRelease。我想我用得不对。当我试图发布时,应用程序崩溃

            if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")){
            //get phone numbers
            ABMultiValueRef emails = ABRecordCopyValue((__bridge ABRecordRef)person,kABPersonEmailProperty);
            for(CFIndex i=0;i<ABMultiValueGetCount(emails);++i) {
                CFStringRef mEmailRef = ABMultiValueCopyValueAtIndex(emails, i);
                CFStringRef mEmailTypeRef = ABMultiValueCopyLabelAtIndex(emails, i);
                NSString * type = (__bridge NSString*) mEmailTypeRef;
                NSString * email = (__bridge NSString*) mEmailRef;
                NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"!$_><"];
                type = [[type componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
                if (!email || [email length]==0 || !type || [type length]==0) {

                }else
                    [GlobalFunctions addValue:email andKey:CONTACT_EMAIL toGroup:type inArray:array];

                if (mEmailRef) {
                    CFRelease(mEmailRef);
                }
                if (mEmailTypeRef) {
                    CFRelease(mEmailTypeRef); // crash
                }
                if (emails) {
                    CFRelease(emails);
                }

            }


        }
if(系统版本大于或等于(@“6.0”)){
//获取电话号码
ABMultiValueRef emails=ABRecordCopyValue((uu bridge ABRecordRef)person,kabbersonemailproperty);

for(CFIndex i=0;i每次使用infor循环发布电子邮件时,您的代码都会崩溃。将此条件写在for循环之外

if (emails) {
   CFRelease(emails);
}

我还想知道您在控制台中遇到了什么错误。

每次使用infor loop释放电子邮件时,您的代码都会崩溃。将此条件写在for loop之外

if (emails) {
   CFRelease(emails);
}

我也想知道你在控制台中得到了什么错误。< /P>你得到的错误信息是什么?当你创建一个核心基础对象或者成为它的所有者时,你会调用cFrRype。当我成为核基金会对象的所有者时,我不确定这个问题。如果我遵循这一点,那么我需要释放电子邮件,MeMaErrf,MeMaEnTyPrEFEF。对吗?如果函数名包含“复制”或“创建”,那么你就拥有了这个对象,所以当你完成它时,你必须释放它。这就是所谓的“创建规则”。这个对象的保留计数是什么?你得到的错误信息是什么?当你创建一个核心基础对象或者成为它的所有者时,你会调用cFrRype。当我成为核心基础对象的所有者时,我不确定这个问题。如果我遵循这个,那么我需要释放电子邮件,MeMaErrf,MeMaMeTyPrEF右?如果函数名C?“复制”或“创建”,然后你拥有这个对象,所以当你完成它的时候,你必须释放它。这被称为“创建规则”。它们是一个了解每个对象(核心基础对象)的方法。此对象的保留计数是多少?是的,但我正在每个循环中创建它。我尝试从循环中进入并最终释放它。没有帮助。如果它仍然崩溃,则可以直接将标签和值分配给NSString,如://get label NSString*rawLabel=(u bridge\u transfer NSString*)ABMultivalueCopyLabelateIndex((u桥ABRecordRef)person,i);//获取值NSString*value=(u桥ABRecordRef*)ABMultiValueCopyValueAtIndex((u桥ABRecordRef)person,i);是的,但我正在每个循环中创建它。我尝试进入循环并最终释放它。没有帮助。如果它仍然崩溃,那么您可以直接将标签和值分配给NSString,如://get label NSString*rawLabel=(\u bridge\u transfer NSString*)ABMultivalueCopyLabelateIndex(\u bridge ABRecordRef)person,i);//获取值NSString*value=(uu桥u传输NSString*)ABMultiValueCopyValueAtIndex((u桥ABRecordRef)person,i);