-[CALayer release]:消息发送到释放的实例 0xc60a690

Posted

技术标签:

【中文标题】-[CALayer release]:消息发送到释放的实例 0xc60a690【英文标题】:-[CALayer release]: message sent to deallocated instance 0xc60a690 【发布时间】:2012-04-11 10:38:48 【问题描述】:

我认为这可能会导致错误,因为我在几个类中使用了按钮的图层属性。我认为这可能是原因,但我不确定。

现在,当我在一段时间后(最多 5 分钟)在 iPod 上运行我的应用程序时,应用程序崩溃并显示以下错误消息:

-[CALayer release]: message sent to deallocated instance 0xc60a690

我该如何解决这个问题?

【问题讨论】:

发布更多代码.. 你是如何分配 CALayer 实例的? 【参考方案1】:

您收到错误是因为一个对象已被释放并且您正尝试向它发送消息。

没有看到您的代码,很难说出您需要做什么才能解决问题。

我建议您阅读 Objective-c 中的内存管理。例如,

Apple Documentation for Memory Management

但是还有很多其他的文件。如果你不理解这些概念,那么你以后会遇到很多问题。

【讨论】:

【参考方案2】:

如果你想在当前视图中删除类 self,并且它有 IBOutlets 连接到你确实需要将 IBOutlets 设置为 nil 的已删除视图,它仍然适用于我,如下所示:

-(void)backRootController //我想在self.tabBarController上把当前viewController改成rootViewController。 RootViewController *_rootViewController = [[RootViewController alloc] init]; NSArray *_viewControllers = self.tabBarController.viewControllers; NSMutableArray *_tabs = [NSMutableArray 数组]; for( UIViewController *_tabViewController in _viewControllers ) 如果(_tabViewController == 自我) _rootViewController.tabBarItem = _tabViewController.tabBarItem; _tabViewController = _rootViewController; [_tabs addObject:_tabViewController]; self.tabBarController.viewControllers = [NSArray arrayWithArray:_tabs]; //将 IBOutlets 设置为 nil 以避免 [CALayer release] 崩溃。 (UILabel、UIView、UIImageView) self.outPreviewLabel = nil; self.outPreviewView = nil; self.outPreviewImageView.image = nil; self.outPreviewImageView = nil; //然后移除视图并交换当前控制器。 [self.view removeFromSuperview]; [self removeFromParentViewController]; [_rootViewController 发布];

【讨论】:

【参考方案3】:

我认为您没有在 viewDidLoad 方法中保留按钮,这就是为什么在一段时间后它们会释放。只需在分配它的末尾添加保留或将其写入@property..

【讨论】:

或者也许学习内存管理的正确用法,而不是仅仅将保留分散到各处,即使它不合适。 我不是那样说你把retain放在任何地方......检查Apple文档然后告诉我我是对还是错......当你在.h类中声明任何变量时,你必须添加它的属性,但没有人使用它,然后面临这样的问题...... 您的回答是“只需在分配它的末尾添加保留”。在分配对象时保留对象并不总是合适的。我认为您需要先再次阅读 Apple 内存管理文档。例如,如果你从一个方法返回一个对象,那么你不会保留它,但你会自动释放它。同样,如果你写一个@property,你并不总是希望在其中保留 - 你可能需要一个副本。 但是如果任何主体没有写入@property 并且在运行时它的任何对象被释放并且应用程序获取应用程序会因以下错误消息而崩溃:- - [CALayer release]: message sent to deallocated instance 0xc60a690 他是什么需要读取内存管理或答案...... 正确查看我的答案我在这里添加了两种情况,而不是告诉他只写保留任何地方......

以上是关于-[CALayer release]:消息发送到释放的实例 0xc60a690的主要内容,如果未能解决你的问题,请参考以下文章

8RocketMQ 源码解析之消息发送

8RocketMQ 源码解析之消息发送

如何根据反应发送消息,然后根据用户消息发送另一个消息?使用 JDA

RocketMQ消息发送流程

RocketMQ Producer发送消息过程

RocketMQ Producer发送消息过程