iOS电话簿导入代码,当前仅仅实现主体框框程序,细节续订;Analysis不会导致内存泄漏
iOS电话簿导入代码,当前仅仅实现主体框框程序,细节续订;Analysis不会导致内存泄漏
引用
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
代码调试:XCode4.5,iOS6.0
主体代码:
1 - (void)testAddress
2 {
3 ABAddressBookRef addressBook = nil;
4
5 if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
6 {
7 addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
8 //等待同意后向下执行
9 dispatch_semaphore_t sema = dispatch_semaphore_create(0);
10 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
11 {
12 dispatch_semaphore_signal(sema);
13 });
14
15 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
16 dispatch_release(sema);
17 }
18 // else
19 // {
20 // addressBook = ABAddressBookCreate();
21 // }
22
23 CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addressBook);
24
25 NSLog(@"%@" ,results);
26
27 int peopleCount = CFArrayGetCount(results);
28
29 for (int i=0; i<peopleCount; i++)
30 {
31 ABRecordRef record = CFArrayGetValueAtIndex(results, i);
32
33 NSLog(@"%@" ,record);
34
35 NSString *fn,*ln,*fullname;
36 fn = ln = fullname = nil;
37
38 CFTypeRef vtmp = NULL;
39
40 vtmp = ABRecordCopyValue(record, kABPersonFirstNameProperty);
41 if (vtmp)
42 {
43 fn = [NSString stringWithString:vtmp];
44
45 CFRelease(vtmp);
46 vtmp = NULL;
47 }
48 vtmp = ABRecordCopyValue(record, kABPersonLastNameProperty);
49 if (vtmp)
50 {
51 ln = [NSString stringWithString:vtmp];
52
53 CFRelease(vtmp);
54 vtmp = NULL;
55 }
56
57 NSLog(@"%@ ,%@" ,fn ,ln);
58
59 // 读取电话
60 ABMultiValueRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
61 int phoneCount = ABMultiValueGetCount(phones);
62
63 for (int j=0; j<phoneCount; j++)
64 {
65 // label
66 CFStringRef lable = ABMultiValueCopyLabelAtIndex(phones, j);
67 // phone number
68 CFStringRef phonenumber = ABMultiValueCopyValueAtIndex(phones, j);
69
70 // localize label
71 CFStringRef ll = ABAddressBookCopyLocalizedLabel(lable);
72
73 NSLog(@"\t%@ ,%@,%@" ,(NSString *)lable ,(NSString *)ll,(NSString *)phonenumber);
74
75 if (ll)
76 CFRelease(ll);
77 if (lable)
78 CFRelease(lable);
79 if (phonenumber)
80 CFRelease(phonenumber);
81 }
82
83 if (phones)
84 CFRelease(phones);
85
86 record = NULL;
87 }
88
89 if (results)
90 CFRelease(results);
91 results = nil;
92
93 if (addressBook)
94 CFRelease(addressBook);
95 addressBook = NULL;
96 }
View Code
- (void)testAddress
{
ABAddressBookRef addressBook = nil;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
// else
// {
// addressBook = ABAddressBookCreate();
// }
CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSLog(@"%@" ,results);
int peopleCount = CFArrayGetCount(results);
for (int i=0; i<peopleCount; i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(results, i);
NSLog(@"%@" ,record);
NSString *fn,*ln,*fullname;
fn = ln = fullname = nil;
CFTypeRef vtmp = NULL;
vtmp = ABRecordCopyValue(record, kABPersonFirstNameProperty);
if (vtmp)
{
fn = [NSString stringWithString:vtmp];
CFRelease(vtmp);
vtmp = NULL;
}
vtmp = ABRecordCopyValue(record, kABPersonLastNameProperty);
if (vtmp)
{
ln = [NSString stringWithString:vtmp];
CFRelease(vtmp);
vtmp = NULL;
}
NSLog(@"%@ ,%@" ,fn ,ln);
// 读取电话
ABMultiValueRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
int phoneCount = ABMultiValueGetCount(phones);
for (int j=0; j<phoneCount; j++)
{
// label
CFStringRef lable = ABMultiValueCopyLabelAtIndex(phones, j);
// phone number
CFStringRef phonenumber = ABMultiValueCopyValueAtIndex(phones, j);
// localize label
CFStringRef ll = ABAddressBookCopyLocalizedLabel(lable);
NSLog(@"\t%@ ,%@,%@" ,(NSString *)lable ,(NSString *)ll,(NSString *)phonenumber);
if (ll)
CFRelease(ll);
if (lable)
CFRelease(lable);
if (phonenumber)
CFRelease(phonenumber);
}
if (phones)
CFRelease(phones);
record = NULL;
}
if (results)
CFRelease(results);
results = nil;
if (addressBook)
CFRelease(addressBook);
addressBook = NULL;
}
另类问题:由于电话号码是从其余地方同步到电话薄,存在手机没有的标签,从而导致内存泄漏
无论生活、还是技术,一切都不断的学习和更新~~~努力~