ios – 如何避免在回调 etc中访问被释放的对象?

ios – 如何避免在回调 etc中访问被释放的对象?,第1张

概述这个问题已经讨论过了 here和 here,但是我想知道是否有更坚实的方法可以解决这个问题,无论你是否有委托 – 当一个函数在延迟后被调用时. 在程序中的某个点,按下按钮,会创建一个对象 – 一个CCLayer.该层创建了几个对象,其中一些在回调中.创建的对象层有一个“后退”按钮,可以销毁它.当该对象被破坏并且尝试访问不再存在的对象时触发回调等时遇到问题 – “发送到解除分配的实例0x258ba4 这个问题已经讨论过了 here和 here,但是我想知道是否有更坚实的方法可以解决这个问题,无论你是否有委托 – 当一个函数在延迟后被调用时.
在程序中的某个点,按下按钮,会创建一个对象 – 一个cclayer.该层创建了几个对象,其中一些在回调中.创建的对象层有一个“后退”按钮,可以销毁它.当该对象被破坏并且尝试访问不再存在的对象时触发回调等时遇到问题 – “发送到解除分配的实例0x258ba480的消息”给了我这个好消息.我该如何避免?

1)有没有办法杀死回调(因为我显然不再需要它们了)
2)应该/我可以在回调本身测试这些可能不存在的对象的存在
3)别的什么?

(我的回调是用于检查我从这个着名网站复制的互联网连接的代码 – 可能它使用Reachability长寿和繁荣 – 我可以通过简单地将其移动到主视图并在其上设置标记来解决问题孩子的观点,但我不想.)

- (voID)testInternetConnection{    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.Google.com"];    // Internet is reachable    internetReachableFoo.reachableBlock = ^(Reachability*reach)    {         // Update the UI on the main thread        dispatch_async(dispatch_get_main_queue(),^{            NSLog(@"Yayyy,we have the interwebs!");            //I do the net stuff here    });};// Internet is not reachableinternetReachableFoo.unreachableBlock = ^(Reachability*reach){    // Update the UI on the main thread    dispatch_async(dispatch_get_main_queue(),^{        NSLog(@"Someone broke the internet :(");        noNetMessageLabel.visible=true; //<-------this goes kaboom        noNetFlag=true;    });};[internetReachableFoo startNotifIEr];

}

解决方法 基本上有两种方法可以避免被释放的代理被发送消息:

>等待稍后要发送的对象.这样他们就不会被解除分配.块回调就是这种情况 – 如果一个块引用某个对象,该对象将被保留,直到该块不再存在.如果从块中发送一些对象并命中一个已释放的对象,则必须在某处搞砸内存管理.>在释放委托之前清除委派链接.现在,这通常使用弱的归零属性来完成,当被引用的对象被释放时,这些属性会自动设置为nil.很方便.不是你的情况.

总结

以上是内存溢出为你收集整理的ios – 如何避免在回调/ etc中访问被释放的对象?全部内容,希望文章能够帮你解决ios – 如何避免在回调/ etc中访问被释放的对象?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存