appDelegate方法,对象的引用计数的不正确的减少,此时调用者不拥有该对象的引用计数

时间:2012-10-04 12:26:49

标签: iphone ios memory-leaks appdelegate

我遇到incorrect decrement of RC to +0的帖子,但没有一个 appDelegate方法(根据我的知识委托不能保留

以下是我有内存泄漏的代码

    iPlayerAppDelegate *appDelegate = (iPlayerAppDelegate *)[[UIApplication sharedApplication] delegate];
    int currentTabIndex = appDelegate.tabcontroller.tabBarController.selectedIndex ;

    UIButton *btn = (UIButton *)sender;


    pageItem* selectedItem = nil;
    selectedItem = [appDelegate.pageData.pageItems objectAtIndex:btn.tag];

    appDelegate.bStatusValue = FALSE;

    if(pageInfo.removeCaptureFile)
    {
        [appDelegate.commonUtils removeFileFromPath:@"snap.jpeg"];
        [appDelegate.commonUtils removeFileFromPath:@"prevSnap.jpeg"];
    }

    if (appDelegate.launchTimer &&[appDelegate.launchTimer isValid]) 
    {
        [appDelegate.launchTimer invalidate];
        appDelegate.launchTimer = nil;          
       // appDelegate.timerFlag = NO;

    }

    NSArray *viewarray = [self.view subviews];

    for(int index=0;index< viewarray.count;index++)
    {

        UIView *view = [viewarray objectAtIndex:index];
        if([view  isMemberOfClass:[UITextField class]] || [view  isMemberOfClass:[UITextView class]])   
        {
            [view resignFirstResponder];
            [view removeFromSuperview];
        }

        if([view  isMemberOfClass:[scrollwinView class]])  
        {
            scrollwinView* scrollView = (scrollwinView*) view;
            [scrollView stopTimer];
        }

    }

    if(appDelegate.tabsupport)
    { //to remove the cached view from stack after pressing back
        CSNavigationController *navcon= (CSNavigationController*)appDelegate.tabcontroller.tabBarController.selectedViewController;
        [navcon removeViewData:pageInfo.screenId];
    }

    int currentscrid=pageInfo.screenId; 
    clrScreenId = pageInfo.clrScreenId;

    if (appDelegate.connMgr) 
    {               
        [appDelegate.connMgr closeHttpStream];
        //[connMgr release];        
        appDelegate.connMgr = nil;
        appDelegate.connectionstatus = FALSE;


        if(appDelegate.initAnimation.startId == 5)      
        {
            appDelegate.transition = NO ;
            [appDelegate readPageData:currentscrid isBack:NO ];
            appDelegate.transition = YES;
            return ;
        }

        [appDelegate stopAnimation];

这里是内存泄漏的快照方法返回一个具有+0保留计数 Method returns an Objective-C object with a +0 retain count的Objective-C对象,并且调用者不在此时拥有的对象的引用计数的不正确减少{ {0}}

为什么我会泄漏?我在重新分配appDelegate对象吗?

我没有在该访问者(appDelegate)的返回值上调用release,也没有将其设置为nil,我该如何解决这个漏洞?

先谢谢

1 个答案:

答案 0 :(得分:-1)

我认为你应该阅读这个关于正确使用app delegate的帖子:

iPhone proper usage of Application Delegate

例如,在您的代码中:

selectedItem = [appDelegate.pageData.pageItems objectAtIndex:btn.tag];

看起来非常凌乱。一个可能更好的解决方案可能是使用单例设计模式。

至于你的内存泄漏,当你的app委托动画执行动画停止回调时,可能会检查你没有保留任何内容。