Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法模拟iOS释放孤立对象的过程?_Ios_Objective C_Xcode - Fatal编程技术网

有没有办法模拟iOS释放孤立对象的过程?

有没有办法模拟iOS释放孤立对象的过程?,ios,objective-c,xcode,Ios,Objective C,Xcode,我有一个很受欢迎的iOS应用程序,但我收到的一些崩溃报告总是在同一条线上。我一辈子都无法复制这个bug,但我怀疑这与我的第三方库不使用ARC有关,所以有些东西在不应该的时候被发布了 我尝试过模拟内存警告,尝试过使用malloc随机获取内存全局,但我无法重现错误。但这种情况经常发生,很多人每天都会发电子邮件抱怨 我知道操作系统会进行一些“清理”,以释放需要自动释放的对象,但有没有办法在模拟器中强制执行此操作?正在向解除分配的对象发送消息 某个对象正试图与已解除分配的DBRequest对话,或者DB

我有一个很受欢迎的iOS应用程序,但我收到的一些崩溃报告总是在同一条线上。我一辈子都无法复制这个bug,但我怀疑这与我的第三方库不使用ARC有关,所以有些东西在不应该的时候被发布了

我尝试过模拟内存警告,尝试过使用malloc随机获取内存全局,但我无法重现错误。但这种情况经常发生,很多人每天都会发电子邮件抱怨


我知道操作系统会进行一些“清理”,以释放需要自动释放的对象,但有没有办法在模拟器中强制执行此操作?

正在向解除分配的对象发送消息

某个对象正试图与已解除分配的DBRequest对话,或者DBRequest正试图与已解除分配的对象对话

最常见的原因是,如果您执行以下操作:

[DBRequest setNetworkRequestDelegate:self];
DBRequest *myDBRequest = [DBRequest initWithURLRequest:request andInformTarget:self selector:@selector(doSomething)];
然后启动一些网络活动,用户移动到另一个视图,该视图解除分配
self
,网络活动完成,并尝试通知
self
已完成


确保您正在调用
[myDBRequest cancel]在100%的情况下,将被通知的对象将被解除分配。
dealloc
方法通常是一个安全的地方。

ARC和非ARC编译代码可以完美地结合在一起,没有任何问题。这是因为ARC“仅”为您插入
retain
s和
release
s。所以肯定还有别的事。显示碰撞报告!下面是崩溃报告:我每天都会收到两份报告,都以DBRequest.m的同一部分为结尾,但是没有人能够可靠地复制它。所以这个问题有着相同类型的崩溃:我跟踪了
SEGV_ACCERR
,在头文件中它说“映射对象的权限无效”(与表示“地址未映射到对象”的另一个子代码相对)。这很有趣;看起来内存是有效的,但可能是只读的,您正在写入它?可能会有一些影响…+1在我看来似乎是合理的。您能解释一下为什么子代码在这种情况下是
SEGV\u ACCERR
而不是
SEGV\u MAPERR
?虽然这是一个好的答案,但问题可能更微妙:假设dealloc方法在主线程(例如UI控制器)上执行。还假设
cancel
很可能具有“异步”样式-其效果,即在接收器中将委托设置为nil,可能是“稍后发生”,可能已同步-与接收器上运行的其他任务序列化。因此,存在潜在竞争条件-应用程序仍可能崩溃。解决此竞争条件的一个方法是保留self,直到接收器确认取消,例如,向代理发送错误。这当然需要receiver在被取消时确实会发送错误。最好的方法当然是使委托成为弱引用并使用ARC。@CouchDeveloper根据DBRequest头文件,
cancel
方法“取消请求并阻止它向委托发送其他消息。”尽管我同意您的看法,他们应该使用ARC。@AaronBrager我没有源代码。如果接收者使用私有线程,并且不使用弱引用或保留委托(只要它需要),则很难在没有潜在竞争的情况下取消委托。仅使用互斥是不够的。DBRecord需要互斥和ea访问委托时的ch时间发送平衡的保留/释放。NSURLConnection使用另一种方法:它在连接期间保留委托。