2011-12-07 2 views
0

sqlite 데이터베이스의 데이터를로드하는 주 앱 대리인에 개체 배열을 만들었습니다. TableView를로드하면이 클래스의 속성이 객체 배열을 가리 키도록 설정됩니다. 그런 다음 TableView가 표시 될 때 행 수에 대한 배열 수를 올바르게 반환하고 배열의 해당 개체 속성에서 셀의 텍스트를 표시합니다.objective-c tableview가 다시로드시 충돌이 발생합니다.

내비게이션 막대의 오른쪽 상단 모서리에있는 새로 고침 단추로 네트워크에서 XML 파일을 다운로드하고 구문 분석 한 다음 데이터베이스를 업데이트합니다.

데이터베이스에서 개체의 주 배열을 다시 만들고 내 TableView 속성을 새 배열로 가리킨 다음 TableView에 데이터를 다시로드하도록 요청합니다. 여기가 EXC_BAD_ACCESS와 충돌합니다.

나는 디버거를 단계별 실행하여 reloadData 호출까지 모든 것이 올 바른 것을 확인했다. 데이터베이스와 주 배열은 모두 동기화되어 있으며 사용자 지정 TableView 속성은 주 배열을 가리키고 있습니다.

그런 다음 디버거를 단계별로 살펴보면서 몇 가지 사실을 알게되었습니다. 첫째, numberOfRowsInSection을 호출하면 주 배열에 대한 포인터가 정확하고 행의 수가 올바른 것입니다. 둘째, 첫 번째 cellForRowAtIndexPath 호출에 도달하면 주 배열에 대한 포인터가 잘못된 메모리 섹션을 가리키고 있습니다. 실제 메모리 주소는 동일하지만 객체 배열이 사라졌습니다.

참조 횟수가 여전히 0보다 커야 가비지 수집이 없어야하므로이 방법과 같이 다시로드하는 동안 배열이 사라지는 방식을 이해할 수 없습니다. 그래서 제 질문은, 아무도 무슨 일이 일어날 지 아무 생각이 없나요? 둘째, 문제의 정확한 위치를 어떻게 결정합니까?

+0

내가 배열이 릴리스되고 있다고 가정하고 있음을 지적해야합니다. 디버거는 배열의 값을 실제 객체 수 대신 {{int (int) [$ VAR count]} objects'로 표시합니다. – richard

답변

2

거의 확실하게 배열을 유지하고 있습니다. "내 참조 횟수가 여전히 0보다 커야합니다."라고 말하면 거의 확실하지 않습니다. 만약 그렇다면, 공개되지 않았을 것입니다.

직접 ivars에 액세스하는 곳을 찾아보십시오. 이것이 메모리 관리 오류의 1 위 원인입니다. dealloc 및 init을 제외한 접근 자 (self.thing)를 통해서만 ivars에 액세스하십시오. 이렇게하면 이러한 종류의 문제 중 90 %가 해결됩니다.

+0

나는 이것이 무슨 뜻인지 잘 모르겠습니다. 접근자를 사용하지 않고 ivars에 어떻게 액세스합니까? – richard

+0

"물건"이라는 속성이 있고 그것을 ivar에 직접 액세스하는 "물건"으로 참조하십시오. 액세서를 사용하는 "self.thing"으로 참조하면됩니다. "thing"과 "self.thing"은 ObjC에서 다른 코드를 실행합니다. –

+0

감사합니다. 내 코드를 살펴보고 내가 찾은 내용으로 업데이트 해 드리겠습니다. – richard

관련 문제