- [CALayer release]:发送到解除分配的实例0xc60a690的消息

时间:2012-04-11 10:38:48

标签: iphone ios5

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

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

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

如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

您收到错误是因为某个对象已被取消分配,而您正试图向其发送消息。

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

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

Apple Documentation for Memory Management

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

答案 1 :(得分:0)

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

-(void)backRootController{
    //I wanna change the current viewController to rootViewController on self.tabBarController.
    RootViewController *_rootViewController = [[RootViewController alloc] init];
    NSArray *_viewControllers = self.tabBarController.viewControllers;
    NSMutableArray *_tabs     = [NSMutableArray array];
    for( UIViewController *_tabViewController in _viewControllers ){
        if( _tabViewController == self ){
            _rootViewController.tabBarItem = _tabViewController.tabBarItem;
            _tabViewController = _rootViewController;
        }
        [_tabs addObject:_tabViewController];
    }
    self.tabBarController.viewControllers = [NSArray arrayWithArray:_tabs];

    //To setup the IBOutlets to nil to avoid [CALayer release] crash. ( UILabel, UIView, UIImageView )
    self.outPreviewLabel           = nil;
    self.outPreviewView            = nil;
    self.outPreviewImageView.image = nil;
    self.outPreviewImageView       = nil;

    //Then remove the view and exchanged current controller.
    [self.view removeFromSuperview];
    [self removeFromParentViewController];
    [_rootViewController release];
}

答案 2 :(得分:-4)

我认为你没有在viewDidLoad方法中保留你的按钮,这就是为什么在一段时间后他们会解除分配。只需在分配它的末尾添加retain或在@property中编写它。