CFRelease(本);ブックの変数はABAddressBookRefのオブジェクトです。 なぜ私はこれをクラッシュさせたのですか? 以下全くコード:ここを実行しているとき:CFRelease(book);そのEXC_BAD_ACCESS(コード= EXC_l386_GPFLT)
- (NSArray *)getAllContactsBeneathiOS9:(NSString *__autoreleasing *)err
{
__block NSMutableArray *contactArray = [[NSMutableArray alloc] init];
//1.Create Address Book instance.
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
//2.Request to access the Address Book
ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
if(granted){
//Access Success
NSArray * allPeople = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(book);
for (int i = 0; i < allPeople.count; i++) {
ABRecordRef alPeople = (__bridge ABRecordRef)(allPeople[i]);
ZRContactItem *item = [[ZRContactItem alloc] init];
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(alPeople, kABPersonFirstNameProperty);
NSString *middleName = (__bridge NSString *)ABRecordCopyValue(alPeople, kABPersonMiddleNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(alPeople, kABPersonLastNameProperty);
ABMultiValueRef phone = ABRecordCopyValue(alPeople, kABPersonPhoneProperty);
CFArrayRef phoneArray = ABMultiValueCopyArrayOfAllValues(phone);
NSMutableArray *phoneList = [[NSMutableArray alloc] init];
if (phoneArray) {
CFIndex phoneCount = CFArrayGetCount(phoneArray);
for (CFIndex j = 0 ; j < phoneCount; j++) {
CFStringRef mobile = ABMultiValueCopyValueAtIndex(phone, j);
[phoneList addObject:(__bridge NSString *)mobile];
CFRelease(mobile);
}
}
if (phoneArray) CFRelease(phoneArray);
if (phone) CFRelease(phone);
ABMultiValueRef email = ABRecordCopyValue(alPeople, kABPersonEmailProperty);
CFArrayRef emailArray = ABMultiValueCopyArrayOfAllValues(email);
NSMutableArray *emailList = [[NSMutableArray alloc] init];
if (emailArray) {
CFIndex emailCount = CFArrayGetCount(emailArray);
for (CFIndex j = 0 ; j < emailCount; j++) {
CFStringRef mail = ABMultiValueCopyValueAtIndex(email, j);
[emailList addObject:(__bridge NSString *)mail];
CFRelease(mail);
}
}
if (emailArray) CFRelease(emailArray);
if (email) CFRelease(email);
ABMultiValueRef address = ABRecordCopyValue(alPeople, kABPersonAddressProperty);
CFArrayRef addrArray = ABMultiValueCopyArrayOfAllValues(address);
NSMutableArray *addrList = [[NSMutableArray alloc] init];
if (addrArray) {
CFDictionaryRef dic = CFArrayGetValueAtIndex(addrArray, 0);
NSString *city = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressCityKey);
NSString *CountryCode = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressCountryCodeKey);
NSString *Country = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressCountryKey);
NSString *State = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressStateKey);
NSString *Street = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressStreetKey);
NSString *ZIP = (__bridge NSString *)CFDictionaryGetValue(dic, kABPersonAddressZIPKey);
NSMutableDictionary *dic1 = [[NSMutableDictionary alloc] init];
dic1[@"street"] = Street;
dic1[@"city"] = city;
dic1[@"state"] = State;
dic1[@"postalCode"] = ZIP;
dic1[@"country"] = Country;
dic1[@"countryCode"] = CountryCode;
[addrList addObject:dic1];
CFRelease(dic);
}
if (addrArray) CFRelease(addrArray);
if (address) CFRelease(address);
item.givenName = [self isnil:firstName];
item.familyName = [self isnil:lastName];
item.middleName = [self isnil:middleName];
item.phoneNumbers = phoneList;
item.email = emailList;
item.address = addrList;
[contactArray addObject:item];
if (alPeople) CFRelease(alPeople);
}
}else{
//Access denied.
*err = @"Grant this application to access your Contacts, please! ";
NSLog(@"%@", *err);
}
//Release book instance
if (book) CFRelease(book);
});
return contactArray;
}
がCFRelease(書籍)を実行しています。それは墜落した。どうして? 私はすでにbookの変数がnilではないと判断しているので、解放することができます。 ご協力いただければ幸いです!
私にコードを教えてもらえますか?私はそれを解決する方法を知らない。 –
慎重な考えの後、私は考えを得た。 変数のブックをスタック領域からヒープ領域にコピーしました。これはヒープ変数ですが、ヒープ変数を解放するとクラッシュしました。私は正しい? –