首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS AddressBook Swift BadAccess

iOS AddressBook Swift BadAccess
EN

Stack Overflow用户
提问于 2014-12-12 08:40:19
回答 1查看 392关注 0票数 0

所以我们的协议是:

我正在构建一个应用程序,可以访问iPhone上的内部通讯簿。一切正常(在模拟器上仍然正常工作),但是现在在设备上,我得到了一个ThreadBreak和lldb,在这一行的控制台中没有出现错误消息:

代码语言:javascript
复制
tempPerson.firstname =  ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as String? ?? ""

再一次,这仍然是在模拟器上工作,提醒你,过去工作得很好。

有一些多线程操作正在进行,因为我使用上面的GCD将地址簿加载到后台的内存中:

代码语言:javascript
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {

我的通讯录装得很好。我已经从我的测试设备(iPhone 6)中删除了这个应用程序,清理了这个项目(认为它可能是一些不喜欢ABAddressBook数据类型的Obj桥文件之间的坏链接,为了好运,我甚至一只脚就跳到了手机的北边。什么都没用。

我只是不明白为什么它会在所有的模拟器上工作,而不是在电话上。但是,我确实注意到,该应用程序在删除后第一次打开时并没有请求访问联系人的权限(尽管调用了授权检查并授予了授权):

代码语言:javascript
复制
case .Authorized:
        return  self.createAddressBook()

我甚至不知道该向大家展示什么,因为它没有返回很多东西,但是这里有一个线程错误的细分(注意:有时它会发生在不同的线程上.)

代码语言:javascript
复制
Thread 4
Queue: com.apple.root.background.-qos (concurrent)

0 swift_getObjectType
1 swift_dynamicCast
2 SomeApp.ViewController.(createAddressBook(SomeApp.ViewController) -> () -> Swift.Bool).(closure #1)
3_Dispatch_call_block_and_release
4_dispatch_client_callout
5_dispatch_root_queue_drain
6_dispatch_worker_thread3
7_pthread_wqthread

Enqueued from com.apple.main-thread (Thread 1)

0_dispatch_async_f_slow
*>> 1_SomeApp.ViewController.createAddressBook(SomeApp.ViewController)() -> Swift.Bool [inlined]
2_SomeApp.ViewController.determineStatus(SomeApp.ViewController)() -> Swift.Bool
3_SomeApp.ViewController.loadContacts(SomeApp.ViewController() -> ()
4_SomeApp.ViewController.viewDidLoad(SomeApp.ViewController() -> ()

... etc Viewloading stuff

在断点上,调试器中给出的两个变量是

收信人

代码语言:javascript
复制
 adbk = (AnyObject?) (instance_type = Builtin.RawPointer = 0x...     EvaluatingTo: Some

ViewController称之为“自我”

代码语言:javascript
复制
self(SomeApp.ViewController)

包含我的应用程序在其他地方使用的所有变量。

很抱歉这么长篇大论,但我真的不知道什么是相关的,什么是不相关的。谢谢你提前帮忙!

更新:我关闭了多线程/调度,但它没有工作。所以这肯定与tempPerson.firstname位有关.

更新2:它确实循环了两次,并在失败之前获得了两个联系人。我认为它达到了一个零值,对于一些联系人来说,这个值并不完全是零,然后就崩溃了。不过,我确实有下面的检查,它正在通过:

代码语言:javascript
复制
if ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as AnyObject? != nil{

&

代码语言:javascript
复制
 if ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() as AnyObject? != nil{

分别使用。

更新3:好的。因此,现在看来,每当有一个空白字段的名字或姓氏,它崩溃(在模拟器现在也)。这真的很糟糕,因为我认为我做了一个很好的检查,以确保我没有访问零价值的财产。更令人讨厌的是,我没有更改这段代码,直到我删除一些派生数据并更改测试文件以避免链接器错误,它才能正常工作。在构建过程中可能发生的任何干扰我的代码的事情?

EN

回答 1

Stack Overflow用户

发布于 2014-12-12 20:47:12

基本上,在访问地址簿时,您需要真正检查类型强制转换,请参见:

代码语言:javascript
复制
tempPerson.lastname = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() as NSObject as? String  ?? ""

问题是,有些人由于各种原因而拥有肮脏的地址簿,甚至还有一些混杂的属性,比如姓氏属性包含"LastName,FirstName空间生日“,而没有名字属性。

无论出于什么原因,先作为NSObject进行类型转换,然后作为字符串进行类型转换似乎很有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27439728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档