gpt4 book ai didi

ios - 如何避免在回调/等中访问已释放的对象?

转载 作者:可可西里 更新时间:2023-11-01 04:26:01 24 4
gpt4 key购买 nike

问题已讨论herehere ,但我想知道是否有更可靠的方法来解决这个问题,无论您是否有代表 - 在延迟后调用函数时。在程序的某个时刻,按下按钮,一个对象——CCLayer——被创建。该层创建了几个对象,其中一些在回调中。创建的对象层有一个“后退”按钮,可以将其销毁。当对象被破坏并尝试访问不再存在的对象后触发回调等时,我遇到了一个问题——“发送到已释放实例 0x258ba480 的消息”给了我这个好消息。我该如何避免这种情况?

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

(我的回调是用于检查我从这个著名网站复制的互联网连接的代码 - 愿它长寿和繁荣 - 使用 Reachability,我可以通过简单地将它移动到主视图并设置一个在 subview 上标记,但我不想这样做。)

- (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 reachable
internetReachableFoo.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];

最佳答案

基本上有两种方法可以避免向解除分配的委托(delegate)发送消息:

  1. 捕获您稍后要发送消息的对象。这样他们就不会被释放。 block 回调就是这种情况——如果一个 block 引用了某个对象,该对象将被保留,直到该 block 不复存在。如果您向 block 中的某些对象发送消息并命中释放的对象,则您一定在某处搞砸了内存管理。

  2. 在释放委托(delegate)之前清除委托(delegate)链接。如今,这通常是使用弱的归零属性完成的,这些属性在释放引用的对象时自动设置为 nil。很方便。不是你的情况。

关于ios - 如何避免在回调/等中访问已释放的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com