0

SO の投稿に出くわしまし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 の Objective-C オブジェクトを返しメソッドは、保持カウントが +0 の Objective-C オブジェクトを返します、呼び出し元がこの時点で所有していないオブジェクトの参照カウントの不適切なデクリメントを返しますこの時点で呼び出し元が所有していないオブジェクトの参照カウントの誤ったデクリメント

なぜこのリークが発生するのですか? appDelegate オブジェクトを再割り当てしていますか?

そのアクセサー (appDelegate) の戻り値でリリースを呼び出したり、nil を設定したりしていません。このリークを修正するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

-1

アプリ デリゲートの正しい使用方法については、次のスレッドをお読みください。

iPhone の Application Delegate の正しい使い方

たとえば、コードでは次のようになります。

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

非常に厄介なようです。考えられるより良い解決策は、シングルトン設計パターンを使用することです。

メモリ リークについては、アプリ デリゲート アニメーションがアニメーション停止コールバックを実行するときに何も保持されていないことを確認してください。

于 2012-10-04T12:35:10.237 に答える