2011-08-02 3 views
2

내 iOS 앱에서 메모리 누수를 추적 한 내가 누수 악기를 사용하여 다음 코드로 돌아오고 계속 :아이폰 OS는 - FMDB 사용 및 메모리

NSMutableArray *resultSet = [[NSMutableArray alloc] initWithCapacity:3]; 

NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init]; 

FMResultSet *rs = [db executeQuery:query,equipmentID]; 
while ([rs next]) 
{ 
    [resultSet addObject: [rs resultDict]]; 
} 
[rs close]; 
[innerPool release]; 

return [resultSet autorelease]; 

것은이 메모리의 측면에서 (정확한 관리) FMDB 사용? 누출

leaks

자세한 스크린 샷 :

detail

답변

1

예,이 올바른 메모리 관리입니다 여기에 누출 악기의 스크린 샷이다. [rs close]; 라인은 기술적으로 불필요합니다. FMResultSet이 풀 배수의 일부로 해제 될 때 (아직 풀리지 않은 경우) 발생하기 때문입니다. 그러나 명시 적으로 거기에 넣는 것이 좋습니다.

반환 배열을 너무 길게 유지할 수 있습니까?

+0

감사 데이브, 그래 내가 오버 유지 반환 배열입니다. 각 항목은 UITableView 셀 하위 클래스에 의해 유지됩니다 (합성 된 setter를 통해). 이것들은 재사용 가능한 대기열에 있으며, 대기열의 작동 방식에 대해 이해할 수없는 내용 일 수 있습니다. [자세히] (https://lh6.googleusercontent.com/-ZbnV40_WTrg/TjhOQKjBB4I/AAAAAAAAMtU/1tIUgWIT_MM/s800/leak2.jpg) 누출의 스크린 샷을 보면, BaseCell setData 메소드는 릴리스가없는 유일한 메소드입니다. 베이스 셀의 dealloc에 ​​[data release]를 추가하면 충돌이 발생합니다. 왜 이것이 설정자를 통해 명확하게 유지되는 것처럼 보일 때 충돌이 발생하는지에 대한 아이디어가 있습니까? – Crake

+1

금연 총은 다음과 같이 밝혀졌다. 'while ([rs next]) { result = [rs resultDict]; } '.... 이것은 셀이 데이터를 저장 한 후에 호출되었으며,이 같은 직접 할당은 나쁜 아이디어라고 생각합니다. 나는 ('rs next '로) { result = [ [rs resultDict] 사본]; } ' – Crake

+0

처음에는 Crake와 사전 동의에 동의했지만 fmdb가 이미'copy'를 호출 했으므로 필요하지 않습니다. –

0

SQLite는 데이터베이스가 닫힐 때만 해제되는 많은 메모리를 할당하고 유지합니다. 'pragma cache_size = nnn'명령을 실행하여 할당 할 메모리 양을 조정할 수도 있습니다.

이 관련 질문과 답변을 참조하십시오 :

memory leak (?) after sqlite+fmdb vacuum command