今天在检查代码时发现,在一个控制器中,关于通讯录的代码长达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这个代理方法没有被调用
解决办法就是在控制器这里声明一个属性了来强引用这个工具类,让它不释放,这样子就解决掉了问题。如果理解的不对,请指正。
网友评论