'메모리누수'에 해당되는 글 1건

  1. 2011.10.07 [iphone] XMLParser, XMLManager에서 메모리 누수 문제 해결!!!
iPhone App2011.10.07 11:16
으악~

진짜 이거 때문에 얼마나 고생했던지...

나도 작가다 앱에서 xmlParsing하는 부분이 많은데 instruments로 체크 해보니 엄청나게 누수가 일어났었다.

근데 누수에서 xmlParser,xmlManager class쪽에서 누수가 나길레 나는 내가 잘못짰나 싶어서 그부분만 엄청나게 봤었다.

하지만 문제는 그쪽이 아니였다.

NSTableView쪽에서 data를 얻어올때

commentDataArray = [[xmlManager GetXmlArrayDataByData:xmlData elementFile:@"CommentElements.plist"] retain];   

이렇게 retain 해서 저장을 하는데

문제는 delloc이나 viewdidUnload를 거치지 않는것이였다.

내가 만든 view가 화면이 없어지는게 아니라서 호출이 안되나보다... 그러니 계속 retain되니 쌓일수 밖에 그리고 refresh,reload할때도 release가 안되었으니 메모리에 계속 저장하니까 문제가 생길수밖에 없었다.

그래서 날짜를 불러오는부분 즉 reload 할때

-(void) reload

{

    //다른 탭들도 리로딩 하도록 요청한다.     

    [[ReloadManager sharedSingletonClass] SetAllTabReload];

    

    //현재탭은 리로딩 안되도록 한다

    [[ReloadManager sharedSingletonClass] setIsRecentPostReload:NO];

    

    //reload 할때 commentDataArray retain임으로 release한다.

    [commentDataArray release];

    commentDataArray = nil;

    [self prepareReload];

    [self performSelector:@selector(getData) withObject:nil afterDelay:0.5];  

}

저렇게 commmentDataArray를 release하고 nil로 하였다.
 

 

 #pragma mark Data Source Loading / Reloading Methods


- (void)reloadTableViewDataSource{

//  should be calling your tableviews data source model to reload

//  put here just for demo  

    [commentDataArray release];

    commentDataArray = nil;

    [self getData];

_reloading = YES;

}

그리고 tableview를 리로드 하는부분(EGoRefreshTable) delegate에도 테이블을 다시 읽을때마다 release하게 했다.

마지막으로 첨에 읽어오는부분에도 처리 했는데 첨에 읽어오는부분에는 첨에는 commentDataArray가 없기때문에 retainCount로 계산해서 넣었다.

-(void) viewDidAppear:(BOOL)animated

{   

    if([[ReloadManager sharedSingletonClass] isRecentPostReload])

    {

        [[ReloadManager sharedSingletonClass] setIsRecentPostReload:NO];

        [self prepareReload];


        //처음 실행이 아닐경우 이전 날짜로 부터 받아오는경우에는  commentDataArray release되지 않음으로 release해준다.

        if([commentDataArray retainCount] !=0)

        {

            [commentDataArray release];

            commentDataArray = nil;

        }

        [self performSelector:@selector(getData) withObject:nil afterDelay:0.5];  

    }

self.view.frame = self.view.superview.bounds;

}

이런식으로.. 

Posted by 동동(이재동)