1

我正在使用来自以下 github 的代码。我只是发布部分代码,请获取完整代码这是一个链接 ,我正在尝试将所有联系人备份到本地数据库中。它工作正常,没有任何问题。但是,当我删除一个联系人或添加一个新的联系人列表时,应用程序在第一个函数中使用 SIGBART 崩溃 - (id) initWithRecord: (ABRecordRef) aRecord WITH THREAD 1 请帮助!!!!

#import "ABContact.h"
#import "ABContactsHelper.h"
#import "ABContactStringConstants.h"
#import "Base64.h"

#define CFAutorelease(obj) ({CFTypeRef _obj = (obj); (_obj == NULL) ? NULL : [(id)CFMakeCollectable(_obj) autorelease]; })

@implementation ABContact
@synthesize record;

// Thanks to Quentarez, Ciaran

- (id) initWithRecord: (ABRecordRef) aRecord
{
    if (self = [super init]) record = CFRetain(aRecord);
    return self;
}

+ (id) contactWithRecord: (ABRecordRef) person
{
    return [[[ABContact alloc] initWithRecord:person] autorelease];
}

+ (id) contactWithRecordID: (ABRecordID) recordID
{
    ABAddressBookRef addressBook = CFAutorelease(ABAddressBookCreate());
    ABRecordRef contactrec = ABAddressBookGetPersonWithRecordID(addressBook, recordID);
    ABContact *contact = [self contactWithRecord:contactrec];

    // CFRelease(contactrec); // Thanks Gary Fung
    return contact;
}

// Thanks to Ciaran
+ (id) contact
{
    ABRecordRef person = ABPersonCreate();
    id contact = [ABContact contactWithRecord:person];
    CFRelease(person);
    return contact;
}

- (void) dealloc
{
    if (record) CFRelease(record);
    [super dealloc];
}

#pragma mark utilities
+ (NSString *) localizedPropertyName: (ABPropertyID) aProperty
{
    return [(NSString *)ABPersonCopyLocalizedPropertyName(aProperty) autorelease];
}

+ (ABPropertyType) propertyType: (ABPropertyID) aProperty
{
    return ABPersonGetTypeOfProperty(aProperty);
}

// Thanks to Eridius for suggestions re switch
+ (NSString *) propertyTypeString: (ABPropertyID) aProperty
{
    switch (ABPersonGetTypeOfProperty(aProperty))
    {
        case kABInvalidPropertyType: return @"Invalid Property";
        case kABStringPropertyType: return @"String";
        case kABIntegerPropertyType: return @"Integer";
        case kABRealPropertyType: return @"Float";
        case kABDateTimePropertyType: return DATE_STRING;
        case kABDictionaryPropertyType: return @"Dictionary";
        case kABMultiStringPropertyType: return @"Multi String";
        case kABMultiIntegerPropertyType: return @"Multi Integer";
        case kABMultiRealPropertyType: return @"Multi Float";
        case kABMultiDateTimePropertyType: return @"Multi Date";
        case kABMultiDictionaryPropertyType: return @"Multi Dictionary";
        default: return @"Invalid Property";
    }
}

+ (NSString *) propertyString: (ABPropertyID) aProperty
{
    /* switch (aProperty) // Sorry, this won't compile
    {
        case kABPersonFirstNameProperty: return FIRST_NAME_STRING;
        case kABPersonMiddleNameProperty: return MIDDLE_NAME_STRING;
        case kABPersonLastNameProperty: return LAST_NAME_STRING;

        case kABPersonPrefixProperty: return PREFIX_STRING;
        case kABPersonSuffixProperty: return SUFFIX_STRING;
        case kABPersonNicknameProperty: return NICKNAME_STRING;

        case kABPersonFirstNamePhoneticProperty: return PHONETIC_FIRST_STRING;
        case kABPersonMiddleNamePhoneticProperty: return PHONETIC_MIDDLE_STRING;
        case kABPersonLastNamePhoneticProperty: return PHONETIC_LAST_STRING;

        case kABPersonOrganizationProperty: return ORGANIZATION_STRING;
        case kABPersonJobTitleProperty: return JOBTITLE_STRING;
        case kABPersonDepartmentProperty: return DEPARTMENT_STRING;

        case kABPersonNoteProperty: return NOTE_STRING;

        case kABPersonKindProperty: return KIND_STRING;

        case kABPersonBirthdayProperty: return BIRTHDAY_STRING;
        case kABPersonCreationDateProperty: return CREATION_DATE_STRING;
        case kABPersonModificationDateProperty: return MODIFICATION_DATE_STRING;

        case kABPersonEmailProperty: return EMAIL_STRING;
        case kABPersonAddressProperty: return ADDRESS_STRING;
        case kABPersonDateProperty: return DATE_STRING;
        case kABPersonPhoneProperty: return PHONE_STRING;
        case kABPersonInstantMessageProperty: return SMS_STRING;
        case kABPersonURLProperty: return URL_STRING;
        case kABPersonRelatedNamesProperty: return RELATED_STRING;          
    } */

    if (aProperty == kABPersonFirstNameProperty) return FIRST_NAME_STRING;
    if (aProperty == kABPersonMiddleNameProperty) return MIDDLE_NAME_STRING;
    if (aProperty == kABPersonLastNameProperty) return LAST_NAME_STRING;

    if (aProperty == kABPersonPrefixProperty) return PREFIX_STRING;
    if (aProperty == kABPersonSuffixProperty) return SUFFIX_STRING;
    if (aProperty == kABPersonNicknameProperty) return NICKNAME_STRING;

    if (aProperty == kABPersonFirstNamePhoneticProperty) return PHONETIC_FIRST_STRING;
    if (aProperty == kABPersonMiddleNamePhoneticProperty) return PHONETIC_MIDDLE_STRING;
    if (aProperty == kABPersonLastNamePhoneticProperty) return PHONETIC_LAST_STRING;

    if (aProperty == kABPersonOrganizationProperty) return ORGANIZATION_STRING;
    if (aProperty == kABPersonJobTitleProperty) return JOBTITLE_STRING;
    if (aProperty == kABPersonDepartmentProperty) return DEPARTMENT_STRING;

    if (aProperty == kABPersonNoteProperty) return NOTE_STRING;

    if (aProperty == kABPersonKindProperty) return KIND_STRING;

    if (aProperty == kABPersonBirthdayProperty) return BIRTHDAY_STRING;
    if (aProperty == kABPersonCreationDateProperty) return CREATION_DATE_STRING;
    if (aProperty == kABPersonModificationDateProperty) return MODIFICATION_DATE_STRING;

    if (aProperty == kABPersonEmailProperty) return EMAIL_STRING;
    if (aProperty == kABPersonAddressProperty) return ADDRESS_STRING;
    if (aProperty == kABPersonDateProperty) return DATE_STRING;
    if (aProperty == kABPersonPhoneProperty) return PHONE_STRING;
    if (aProperty == kABPersonInstantMessageProperty) return SMS_STRING;
    if (aProperty == kABPersonURLProperty) return URL_STRING;
    if (aProperty == kABPersonRelatedNamesProperty) return RELATED_STRING;

    if (aProperty == kABPersonSocialProfileProperty) return SOCIAL_STRING;

    return nil;
}

+ (BOOL) propertyIsMultivalue: (ABPropertyID) aProperty;
{
    if (aProperty == kABPersonFirstNameProperty) return NO;
    if (aProperty == kABPersonMiddleNameProperty) return NO;
    if (aProperty == kABPersonLastNameProperty) return NO;

    if (aProperty == kABPersonPrefixProperty) return NO;
    if (aProperty == kABPersonSuffixProperty) return NO;
    if (aProperty == kABPersonNicknameProperty) return NO;

    if (aProperty == kABPersonFirstNamePhoneticProperty) return NO;
    if (aProperty == kABPersonMiddleNamePhoneticProperty) return NO;
    if (aProperty == kABPersonLastNamePhoneticProperty) return NO;

    if (aProperty == kABPersonOrganizationProperty) return NO;
    if (aProperty == kABPersonJobTitleProperty) return NO;
    if (aProperty == kABPersonDepartmentProperty) return NO;

    if (aProperty == kABPersonNoteProperty) return NO;

    if (aProperty == kABPersonKindProperty) return NO;

    if (aProperty == kABPersonBirthdayProperty) return NO;
    if (aProperty == kABPersonCreationDateProperty) return NO;
    if (aProperty == kABPersonModificationDateProperty) return NO;

    return YES;
    /*
    if (aProperty == kABPersonEmailProperty) return YES;
    if (aProperty == kABPersonAddressProperty) return YES;
    if (aProperty == kABPersonDateProperty) return YES;
    if (aProperty == kABPersonPhoneProperty) return YES;
    if (aProperty == kABPersonInstantMessageProperty) return YES;
    if (aProperty == kABPersonURLProperty) return YES;
    if (aProperty == kABPersonRelatedNamesProperty) return YES;
    if (aProperty == kABPersonSocialProfileProperty) return YES;
     */
}

+ (NSArray *) arrayForProperty: (ABPropertyID) anID inRecord: (ABRecordRef) record
{
    // Recover the property for a given record
    CFTypeRef theProperty = ABRecordCopyValue(record, anID);
    NSArray *items = (NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty);
    CFRelease(theProperty);
    return [items autorelease];
}

+ (id) objectForProperty: (ABPropertyID) anID inRecord: (ABRecordRef) record
{
    return [(id) ABRecordCopyValue(record, anID) autorelease];
}

+ (NSDictionary *) dictionaryWithValue: (id) value andLabel: (CFStringRef) label
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    if (value) [dict setObject:value forKey:@"value"];
    if (label) [dict setObject:(NSString *)label forKey:@"label"];
    return dict;
}

+ (NSDictionary *) addressWithStreet: (NSString *) street withCity: (NSString *) city
                           withState:(NSString *) state withZip: (NSString *) zip
                         withCountry: (NSString *) country withCode: (NSString *) code
{
    NSMutableDictionary *md = [NSMutableDictionary dictionary];
    if (street) [md setObject:street forKey:(NSString *) kABPersonAddressStreetKey];
    if (city) [md setObject:city forKey:(NSString *) kABPersonAddressCityKey];
    if (state) [md setObject:state forKey:(NSString *) kABPersonAddressStateKey];
    if (zip) [md setObject:zip forKey:(NSString *) kABPersonAddressZIPKey];
    if (country) [md setObject:country forKey:(NSString *) kABPersonAddressCountryKey];
    if (code) [md setObject:code forKey:(NSString *) kABPersonAddressCountryCodeKey];
    return md;
}

+ (NSDictionary *) smsWithService: (CFStringRef) service andUser: (NSString *) userName
{
    NSMutableDictionary *sms = [NSMutableDictionary dictionary];
    if (service) [sms setObject:(NSString *) service forKey:(NSString *) kABPersonInstantMessageServiceKey];
    if (userName) [sms setObject:userName forKey:(NSString *) kABPersonInstantMessageUsernameKey];
    return sms;
}

+ (NSDictionary *) socialWithService: (CFStringRef) service andUser: (NSString *) userName andUserIdentifier: (NSString *) userIdentifier
{
    NSMutableDictionary *social = [NSMutableDictionary dictionary];
    if (service) [social setObject:(NSString *) service forKey:(NSString *) kABPersonSocialProfileServiceKey];
    if (userName) [social setObject:userName forKey:(NSString *) kABPersonSocialProfileUsernameKey];
    if (userIdentifier) [social setObject:userIdentifier forKey:(NSString *) kABPersonSocialProfileUserIdentifierKey];
    return social;
}

// Thanks to Eridius for suggestions re: error
- (BOOL) removeSelfFromAddressBook: (NSError **) error
{
    ABAddressBookRef addressBook = CFAutorelease(ABAddressBookCreate());
    if (!ABAddressBookRemoveRecord(addressBook, self.record, (CFErrorRef *) error)) return NO;
    return ABAddressBookSave(addressBook,  (CFErrorRef *) error);
}

#pragma mark Record ID and Type
- (ABRecordID) recordID {return ABRecordGetRecordID(record);}
- (ABRecordType) recordType {return ABRecordGetRecordType(record);}
- (BOOL) isPerson {return self.recordType == kABPersonType;}

#pragma mark Getting Single Value Strings
- (NSString *) getRecordString:(ABPropertyID) anID
{
    return [(NSString *) ABRecordCopyValue(record, anID) autorelease];
}
- (NSString *) firstname {return [self getRecordString:kABPersonFirstNameProperty];}
- (NSString *) middlename {return [self getRecordString:kABPersonMiddleNameProperty];}
- (NSString *) lastname {return [self getRecordString:kABPersonLastNameProperty];}

- (NSString *) prefix {return [self getRecordString:kABPersonPrefixProperty];}
- (NSString *) suffix {return [self getRecordString:kABPersonSuffixProperty];}
- (NSString *) nickname {return [self getRecordString:kABPersonNicknameProperty];}

- (NSString *) firstnamephonetic {return [self getRecordString:kABPersonFirstNamePhoneticProperty];}
- (NSString *) middlenamephonetic {return [self getRecordString:kABPersonMiddleNamePhoneticProperty];}
- (NSString *) lastnamephonetic {return [self getRecordString:kABPersonLastNamePhoneticProperty];}

- (NSString *) organization {return [self getRecordString:kABPersonOrganizationProperty];}
- (NSString *) jobtitle {return [self getRecordString:kABPersonJobTitleProperty];}
- (NSString *) department {return [self getRecordString:kABPersonDepartmentProperty];}
- (NSString *) note {return [self getRecordString:kABPersonNoteProperty];}

#pragma mark Contact Name Utility
- (NSString *) contactName
{
    NSMutableString *string = [NSMutableString string];

    if (self.firstname || self.lastname)
    {
        if (self.prefix) [string appendFormat:@"%@ ", self.prefix];
        if (self.firstname) [string appendFormat:@"%@ ", self.firstname];
        if (self.nickname) [string appendFormat:@"\"%@\" ", self.nickname];
        if (self.lastname) [string appendFormat:@"%@", self.lastname];

        if (self.suffix && string.length)
            [string appendFormat:@", %@ ", self.suffix];
        else
            [string appendFormat:@" "];
    }

    if (self.organization) [string appendString:self.organization];
    return [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (NSString *) compositeName
{
    NSString *string = (NSString *)ABRecordCopyCompositeName(record);
    return [string autorelease];
}

#pragma mark NUMBER
- (NSNumber *) getRecordNumber: (ABPropertyID) anID
{
    return [(NSNumber *) ABRecordCopyValue(record, anID) autorelease];
}

- (NSNumber *) kind {return [self getRecordNumber:kABPersonKindProperty];}



@end`
4

0 回答 0