通讯录(有界面)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//1.创建通讯录 联系人控制器
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc]init];
//设置代理
picker.peoplePickerDelegate = self;
//2.展示控制器
[self presentViewController:picker animated:YES completion:nil];
}
//选中一个联系人信息的时候就会调用
//实现了peoplePickerNavigationController 方法 选择联系人自动销毁模态框
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
{
//内存泄露
//潜在 内存泄露
//内存
// oc 框架 编译标记 告诉系统 person.h person.m 30
// .a 文件
// c malloc free
// c++ new delete
// oc alloc retain copy release
// cf copy cr eate 等 CFRelease
//Record 记录 c语言 调用一个方法 -> 传递参数 -> 完成功能
//参数1 person 参数2 属性 电话 姓名
//姓名
CFStringRef strFirst = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef strLast = ABRecordCopyValue(person, kABPersonLastNameProperty);
//桥接 __bridge 不会转让所有权
//转让所有权 __bridge_transfer
NSString *firstName = (__bridge_transfer NSString *)(strFirst);
NSString *lastName = (__bridge_transfer NSString *)(strLast);
NSLog(@"first = %@ last = %@ ",firstName,lastName);
// if (strFirst) {
// CFRelease(strFirst);
// }
// if (strLast) {
// CFRelease(strLast);
// }
//手机号
//类似于数组的类型 里面存放所有的电话号码 -> 遍历
ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
//不确定 住宅 手机 公司
CFIndex index = ABMultiValueGetCount(multi);
for (CFIndex i = 0; i < index; ++i) {
//获取数组中 参数1 multi 参数2 哪个下标
CFStringRef strPhone = ABMultiValueCopyValueAtIndex(multi, i);
NSString *phone = (__bridge_transfer NSString *)(strPhone);
NSLog(@"phone = %@",phone);
//CFRelease(strPhone);
}
if (multi) {
CFRelease (multi);
}
{
//1.创建通讯录 联系人控制器
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc]init];
//设置代理
picker.peoplePickerDelegate = self;
//2.展示控制器
[self presentViewController:picker animated:YES completion:nil];
}
//选中一个联系人信息的时候就会调用
//实现了peoplePickerNavigationController 方法 选择联系人自动销毁模态框
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
{
//内存泄露
//潜在 内存泄露
//内存
// oc 框架 编译标记 告诉系统 person.h person.m 30
// .a 文件
// c malloc free
// c++ new delete
// oc alloc retain copy release
// cf copy cr eate 等 CFRelease
//Record 记录 c语言 调用一个方法 -> 传递参数 -> 完成功能
//参数1 person 参数2 属性 电话 姓名
//姓名
CFStringRef strFirst = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef strLast = ABRecordCopyValue(person, kABPersonLastNameProperty);
//桥接 __bridge 不会转让所有权
//转让所有权 __bridge_transfer
NSString *firstName = (__bridge_transfer NSString *)(strFirst);
NSString *lastName = (__bridge_transfer NSString *)(strLast);
NSLog(@"first = %@ last = %@ ",firstName,lastName);
// if (strFirst) {
// CFRelease(strFirst);
// }
// if (strLast) {
// CFRelease(strLast);
// }
//手机号
//类似于数组的类型 里面存放所有的电话号码 -> 遍历
ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
//不确定 住宅 手机 公司
CFIndex index = ABMultiValueGetCount(multi);
for (CFIndex i = 0; i < index; ++i) {
//获取数组中 参数1 multi 参数2 哪个下标
CFStringRef strPhone = ABMultiValueCopyValueAtIndex(multi, i);
NSString *phone = (__bridge_transfer NSString *)(strPhone);
NSLog(@"phone = %@",phone);
//CFRelease(strPhone);
}
if (multi) {
CFRelease (multi);
}
}
通讯录(无界面)
授权页面
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/*
kABAuthorizationStatusNotDetermined = 0, 未决定是否授
kABAuthorizationStatusRestricted, 家长限制
kABAuthorizationStatusDenied, 明确拒绝
kABAuthorizationStatusAuthorized //授权
*/
//1.授权
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { //没有授权 需要授权
ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权成功!!");
}else{
NSLog(@"授权失败!!");
}
});
}
CFRelease(book);
return YES;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/*
kABAuthorizationStatusNotDetermined = 0, 未决定是否授
kABAuthorizationStatusRestricted, 家长限制
kABAuthorizationStatusDenied, 明确拒绝
kABAuthorizationStatusAuthorized //授权
*/
//1.授权
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { //没有授权 需要授权
ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权成功!!");
}else{
NSLog(@"授权失败!!");
}
});
}
CFRelease(book);
return YES;
}
ViewController页面
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//2.获取数据
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
//c 语言 API 获取所有人的记录
CFArrayRef arrayref = ABAddressBookCopyArrayOfAllPeople(book);
CFIndex count = CFArrayGetCount(arrayref);
for (int i = 0; i < count; i++) {
//一条记录对应一个人的信息
ABRecordRef record = CFArrayGetValueAtIndex(arrayref, i);
//姓名 电话
CFStringRef first = ABRecordCopyValue(record, kABPersonFirstNameProperty);
CFStringRef last = ABRecordCopyValue(record, kABPersonLastNameProperty);
NSString *fistName = (__bridge_transfer NSString *)first;
NSString *lastName = (__bridge_transfer NSString *)last;
NSLog(@"%@ %@",fistName,lastName);
ABMultiValueRef multi = ABRecordCopyValue(record, kABPersonPhoneProperty);
for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++ ) {
CFStringRef strPhone = ABMultiValueCopyValueAtIndex(multi, i);
NSString *phone = (__bridge_transfer NSString *)strPhone;
NSLog(@"%@" ,phone);
}
CFRelease(multi);
}
CFRelease(arrayref);
CFRelease(book);
{
//2.获取数据
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
//c 语言 API 获取所有人的记录
CFArrayRef arrayref = ABAddressBookCopyArrayOfAllPeople(book);
CFIndex count = CFArrayGetCount(arrayref);
for (int i = 0; i < count; i++) {
//一条记录对应一个人的信息
ABRecordRef record = CFArrayGetValueAtIndex(arrayref, i);
//姓名 电话
CFStringRef first = ABRecordCopyValue(record, kABPersonFirstNameProperty);
CFStringRef last = ABRecordCopyValue(record, kABPersonLastNameProperty);
NSString *fistName = (__bridge_transfer NSString *)first;
NSString *lastName = (__bridge_transfer NSString *)last;
NSLog(@"%@ %@",fistName,lastName);
ABMultiValueRef multi = ABRecordCopyValue(record, kABPersonPhoneProperty);
for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++ ) {
CFStringRef strPhone = ABMultiValueCopyValueAtIndex(multi, i);
NSString *phone = (__bridge_transfer NSString *)strPhone;
NSLog(@"%@" ,phone);
}
CFRelease(multi);
}
CFRelease(arrayref);
CFRelease(book);
}