【问题标题】:App is crashing when moving to other app and then moving back移动到其他应用程序然后返回时应用程序崩溃
【发布时间】:2012-05-12 14:13:04
【问题描述】:

我的应用有问题..
当我使用主页按钮进行多任务处理以移动到另一个应用程序时,它崩溃了,当我想再次回到我的应用程序时它崩溃了,我收到消息:

*** -[UIView convertRect:toView:]: message sent to deallocated instance 0x81e4020

自从我实施“内部视图”广告以来就开始了。
我需要在我的代码中做些什么来让它消失吗?
我试图解决它,但没有成功。
这是我的广告代码:

    CGRect frame = CGRectMake(0, 480, 320, 50);
    self.adBanner = [[UIView alloc] initWithFrame:frame];
    [self.view convertRect:adBanner.frame toView:nil];   --->This is a line i tried to put...
    [self.view addSubview:self.adBanner];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdReceived:) name:@"iaAdReceived" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaDefaultAdReceived:) name:@"iaDefaultAdReceived" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdFailed:) name:@"IaAdFailed" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdClicked:) name:@"IaAdClicked" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdWillShow:) name:@"IaAdWillShow" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdDidShow:) name:@"IaAdDidShow" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdWillHide:) name:@"IaAdWillHide" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdDidHide:) name:@"IaAdDidHide" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdWillClose:) name:@"IaAdWillClose" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdDidClose:) name:@"IaAdDidClose" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdWillResize:) name:@"IaAdWillResize" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdDidResize:) name:@"IaAdDidResize" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdWillExpand:) name:@"IaAdWillExpand" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAdDidExpand:) name:@"IaAdDidExpand" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAppShouldSuspend:) name:@"IaAppShouldSuspend" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iaAppShouldResume:) name:@"IaAppShouldResume" object:nil];

    // Display ad
    if (![InneractiveAd DisplayAd:@"iOS_Test" withType:IaAdType_Banner withRoot:self.adBanner withReload:60 withParams:optionalParams])
    {
        [adBanner removeFromSuperview];
    }
}

    -(void) viewWillDisappear:(BOOL)animated
    {
            [super viewWillDisappear:animated];
            [adBanner removeFromSuperview];
    }

- (IBAction)iaAdReceived:(id)sender
   {
       // The ad view has finished loading a paid ad
   }

    - (IBAction)iaDefaultAdReceived:(id)sender
    {
        // The ad view has finished loading a default ad
    }

    - (IBAction)iaAdFailed:(id)sender
    {
        // The ad view has failed to load an ad
    }

    - (IBAction)iaAdClicked:(id)sender
    {
        // The ad has been clicked
    }

    - (IBAction)iaAdWillShow:(id)sender
    {
        // The ad is about to show
    }

    - (IBAction)iaAdDidShow:(id)sender
    {
        // The ad did show
    }

    - (IBAction)iaAdWillHide:(id)sender
    {
        // The ad is about to hide
    }

    - (IBAction)iaAdDidHide:(id)sender
    {
        // The ad did hide
    }

    - (IBAction)iaAdWillClose:(id)sender
    {
        // The ad is about to close
    }

    - (IBAction)iaAdDidClose:(id)sender
    {
        // The ad did close
    }

    - (IBAction)iaAdWillResize:(id)sender
    {
        // The ad is about to resize
    }

    - (IBAction)iaAdDidResize:(id)sender
    {
        // The ad did resize
    }

    - (IBAction)iaAdWillExpand:(id)sender
    {
        // The ad is about to expand
    }

    - (IBAction)iaAdDidExpand:(id)sender
    {
        // The ad did expand
    }

    - (IBAction)iaAppShouldSuspend:(id)sender
    {
        // The app should suspend (for example, when the ad expands)
    }

    - (IBAction)iaAppShouldResume:(id)sender
    {
        // The app should resume (for example, when the ad collapses)
    }

我附上了截图...
会是什么?
谢谢...

【问题讨论】:

  • 突然我注意到,当我在评论中添加 viewWillDisappear 时,一切似乎都正常工作:-(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [adBanner removeFromSuperview]; } 很奇怪......但也许你知道为什么?
  • 如果你想测试现有的应用程序并重新进入它,将你的应用程序运行到设备上,然后当它完成构建命中命令-。停止构建。从那里尝试再次启动您的应用程序,它可能会工作,有时 Xcode 调试在这些状态之间移动的应用程序可能会导致崩溃。

标签: ios memory-management rect


【解决方案1】:

你的问题是运行时:

[self.view convertRect:adBanner.frame toView:nil];

您的视图不再存在。

在你的 appDelegate 中你应该使用这个方法:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
/*
 Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 */
}

无论如何,你想用这条线实现什么?因为它返回了一个你没有使用的 CGRect。

【讨论】:

  • 谢谢moxy..实际上我认为这条线解决了问题,但后来我发现它没有。现在我知道它是因为 viewWillDisappear 方法......还不知道为什么。当我移动到不同的视图时,我想隐藏横幅,但它使我的应用程序崩溃:\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多