1

我正在开发一个 iphone 应用程序,该应用程序在用户有很多联系人的情况下崩溃。下面是一个导致崩溃的函数调用,但仅当用户有大约。超过 500 个联系人。下面是一个函数调用。在此先感谢。

- (IBAction)addToAddressBook{

NSString *importString = [[NSString alloc] init];
importString = importTextView.text;
if (importString==nil) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Could not Find Text" 
                                                    message:@"Try Pasting the Text Again" 
                                                   delegate:nil 
                                          cancelButtonTitle:@"Cancel"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}
statusLabel.text = @"Importing Lines";
NSArray *importLines = [importString componentsSeparatedByString:@"\n"];
[importString release];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFRetain(addressBook);

ABRecordRef person;
CFErrorRef error = NULL;


ABMutableMultiValueRef multiPhone;
ABMutableMultiValueRef multiURL = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
ABMutableMultiValueRef multiDate = ABMultiValueCreateMutable(kABMultiStringPropertyType);

NSMutableDictionary *addressDictionary;
statusLabel.text = @"Counting Records";
int totalRecords = 0;
for( int j = 0; j < 5; j++){
    NSString *line = [importLines objectAtIndex:j];
    if ([line rangeOfString: @"Contacts:"].location!=NSNotFound) {
        NSString *totalContactsLabel = [[line componentsSeparatedByString:@" Contacts: "] objectAtIndex:1];
        totalRecords = [totalContactsLabel intValue];
    }
}






int recordNumber = 0;
statusLabel.text = [NSString stringWithFormat:@"%i/%i", recordNumber, totalRecords];
for (NSString *line in importLines)
{
 if (![line isEqualToString:@""])
{

        NSMutableString *mutableLine = [NSMutableString stringWithString: line];


        if ([line hasPrefix:@"---"]) {
            //NSLog(@"starting new person");
            person = ABPersonCreate();
            multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); //clear multiphone for each new person
            multiURL = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
            multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
            multiDate = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 


        } else if ([line hasPrefix:@"First Name: "]) {
            [mutableLine deleteCharactersInRange: [mutableLine rangeOfString: @"First Name: "]];
            line = (NSString *)mutableLine;
            ABRecordSetValue(person, kABPersonFirstNameProperty, line, &error);

        } else if ([line hasPrefix:@"Middle Name: "]) {
            [mutableLine deleteCharactersInRange: [mutableLine rangeOfString: @"Middle Name: "]];
            line = (NSString *)mutableLine;
            ABRecordSetValue(person, kABPersonMiddleNameProperty, line, &error);

        } else if ([line hasPrefix:@"Last Name: "]) {
            [mutableLine deleteCharactersInRange: [mutableLine rangeOfString: @"Last Name: "]];
            line = (NSString *)mutableLine;
            ABRecordSetValue(person, kABPersonLastNameProperty, line, &error);

        } else if ([line rangeOfString: @"Phone:"].location!=NSNotFound) {
            NSString *phoneLabel = [[line componentsSeparatedByString:@" Phone: "] objectAtIndex:0];
            NSString *phoneContent = [[line componentsSeparatedByString:@" Phone: "] objectAtIndex:1];
            if ([phoneLabel isEqualToString:@"Mobile"]) {
                ABMultiValueAddValueAndLabel(multiPhone, phoneContent, kABPersonPhoneMobileLabel, NULL);
                ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone, &error);
            } else if ([phoneLabel isEqualToString:@"Home"]) {
                ABMultiValueAddValueAndLabel(multiPhone, phoneContent, kABHomeLabel, NULL);
                ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone, &error);
            } else if ([phoneLabel isEqualToString:@"Work"]) {
                ABMultiValueAddValueAndLabel(multiPhone, phoneContent, kABWorkLabel, NULL);
                ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone, &error);
            } else if ([phoneLabel isEqualToString:@"iPhone"]) {
                ABMultiValueAddValueAndLabel(multiPhone, phoneContent, kABPersonPhoneIPhoneLabel, NULL);
                ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone, &error);
            } else {
                ABMultiValueAddValueAndLabel(multiPhone, phoneContent, (CFStringRef)phoneLabel, NULL);
                ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone, &error);
            }
        }else if ([line rangeOfString: @"Email:"].location!=NSNotFound) {
            NSString *emailLabel = [[line componentsSeparatedByString:@" Email: "] objectAtIndex:0];
            NSString *emailContent = [[line componentsSeparatedByString:@" Email: "] objectAtIndex:1];
            if ([emailLabel isEqualToString:@"Main"]) {
                ABMultiValueAddValueAndLabel(multiEmail, emailContent, (CFStringRef)@"Main", NULL);
                ABRecordSetValue(person, kABPersonEmailProperty, multiEmail, &error);
            }else if ([emailLabel isEqualToString:@"Work"]) {
                ABMultiValueAddValueAndLabel(multiEmail, emailContent, kABWorkLabel, NULL);
                ABRecordSetValue(person, kABPersonEmailProperty, multiEmail, &error);
            } else {
                ABMultiValueAddValueAndLabel(multiEmail, emailContent, (CFStringRef)emailLabel, NULL);
                ABRecordSetValue(person, kABPersonEmailProperty, multiEmail, &error);
            }
        }

        if ([line hasPrefix:@"- -"]) {
            //ABRecordSetValue(person, kABPersonEmailProperty, multiEmail, &error);

            NSString *updateText;
            NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
            NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

            if (![self personAlreadyExists:firstName withName:lastName]){
                ABAddressBookAddRecord(addressBook, person, &error);
                ABAddressBookSave(addressBook, &error);
                recordNumber++;

                if (firstName==nil) {
                    updateText = [NSString stringWithFormat:@"%@ added.", lastName];
                } else if (lastName==nil) {
                    updateText = [NSString stringWithFormat:@"%@ added.", firstName];
                } else {
                    updateText = [NSString stringWithFormat:@"%@ %@ added.", firstName, lastName];
                }

                //NSLog(updateText);
            } else {
                if (firstName==nil) {
                    updateText = [NSString stringWithFormat:@"%@ skipped.", lastName];
                } else if (lastName==nil) {
                    updateText = [NSString stringWithFormat:@"%@ skipped.", firstName];
                } else {
                    updateText = [NSString stringWithFormat:@"%@ %@ skipped.", firstName, lastName];
                }
                //NSLog(updateText);
            }

            updateLabel.text = [updateLabel.text stringByAppendingFormat:@"%@\n", updateText];

            statusLabel.text = @"";

            NSLog(@"%i/%i Imported", recordNumber, totalRecords);


        }

        if (error != NULL) {                    
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not create contact" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
            [alert show];
            [alert release];
        }
    }
}
//[importLines release];


[activity stopAnimating];
activity.hidden = TRUE;

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add To Contacts" message:[NSString stringWithFormat:@"Contacts successfully restored!", ABRecordCopyValue(person, kABPersonFirstNameProperty)] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
 } 
4

0 回答 0