iOS通讯录的简单封装

2017-06-16  本文已影响44人  弹簧有弹力

今天在检查代码时发现,在一个控制器中,关于通讯录的代码长达200行,有点坑爹,所以就想着怎么封装一下;
一开始想的是用工具类方法进行封装,调用简单,一个方法搞定,点击回调直接在方法后面加个Block。后面想了想类方法里面是不能引用属性的,因为在通讯录里面需要调用它的delegate,所以这个方法失败了。
现在用的是实例方法,调用也简单,才3行代码,加一个代理回调。但是现实很骨感,理想很丰满,现在分享一下我在封装过程中遇到的坑,

一开始的调用时这样子的

        THAddressListTool *tool = [[THAddressListTool alloc] init];
        tool.delegate = self;
        [tool loadPersonAddressBooks];

测试机是ipone6s-系统版本10.3.2
测试发现

/// CNContactPickerDelegate 点击代理
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;

这个代理方法没有调用
只要一点击联系人就去打电话了,没有选中联系人回到应用中

出现BUG了,开始检查代码

    CNContactPickerViewController *picker = [[CNContactPickerViewController alloc] init];
    picker.delegate = self;
    [[self currentViewController] presentViewController:picker animated:YES completion:nil];

检查初始化方法,发现代理设置成了THAddressListTool的,这个是没有问题的

既然这里没有问题,那么就检查上层的代码
问题还是出现在外部调用这里

- (void)testAddressListTool{
        THAddressListTool *tool = [[THAddressListTool alloc] init];
        tool.delegate = self;
        [tool loadPersonAddressBooks];
}

因为是局部变量,当系统执行完testAddressListTool这个方法之后,里面的资源会被释放掉,这样就造成了CNContactPickerDelegate这个代理方法没有被调用
解决办法就是在控制器这里声明一个属性了来强引用这个工具类,让它不释放,这样子就解决掉了问题。如果理解的不对,请指正。

上一篇下一篇

猜你喜欢

热点阅读