2011-12-31 3 views
1

여기에 약간의 손실이 있습니다. 누군가 내가 잘못 생각한 부분을 지적하기를 바랍니다.didReceiveMemoryWarning 후 iOS UITableView가 공백이되었습니다.

내 응용 프로그램은 iPads를위한 마스터 /보기 응용 프로그램입니다.

내 MasterView는 UITableView에서 상속 받았으며 didReceiveMemoryWarning이없는 한 정상적으로 작동합니다. 맞춤형 셀 내용물을 가지고 있으며, 모든 것이 다뤄집니다. 지금까지 그렇게 좋았고 빌드하는데 몇 시간 밖에 걸리지 않았습니다.

그러나 일단 didReceiveMemoryWarning을 얻으면 self.tableView가 이상하게 동작하는 것 같습니다. numberOfSectionsInTableView하고있는 tableView : numberOfRowsInSection : 방법은 다시 호출되지 않습니다, 그리고 내 코드는 다음과 같이 (메모리 경고 후) 첫 번째 항목을 선택하려고 할 때 :

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
       animated:NO 
       scrollPosition:UITableViewScrollPositionMiddle]; 

와 충돌 - [ UITableView scrollToRowAtIndexPath : atScrollPosition : animated :] : 구역 (0)의 경계 (0)를 벗어나는 행 (0). '

그래서 무엇을 제공합니까? 메모리 경고 중 내 tableView의 메모리가 완전히 지워지면 왜 nil로 설정되지 않았습니까? 또한 어떻게 다시 구축해야합니까?

답변

1

인터페이스 빌더 당 테이블 뷰를 코드별로 구현하고 있습니까? 당신이 자기를 사용할 때 당신은 보유 속성을 사용한다고 가정합니다. 이 값을 viewDidUnLoad에서 nil로 설정하고 dealloc 메소드에서 필드 포인터를 해제했는지 확인하십시오. 그렇지 않다면 문제는 다른 곳을 낳습니다.하지만 좋은 습관 때문에 문제가 있다고 생각합니다.

코드별로 tableview를 작성하고 viewDidUnload에서 속성을 nil로 설정 한 경우 메모리 경고를받은 후에 다시 할당해야합니다. 그 일을 할 수있는 장소는 viewDidLoad, initWith 등입니다. View로드는 Nav 또는 TabBarController를 통해 돌아 가면 바로 호출되기 때문에 대부분 더 나은 옵션입니다.

인터페이스 빌더를 사용하고 뷰가 AppDelegate (예 : didFinishLaunchingWithOptions 메서드)에로드되면 awakeFromNib 메서드는 다시 호출하지 않으면 다시 호출되지 않습니다. 따라서 DONT는 viewDidUnload에서 인스턴스 변수를 nil로 설정합니다. 그렇지 않으면 인터페이스 빌더 tableview에 대한 포인터를 잃어 버릴 것입니다.이 마지막 부분은 이유가 될 수 있지만 실제로 IMO가 좋지 않기 때문에 그렇게해서는 안됩니다.

코드에 대해 자세히 알려 주시면 좀 더 구체적으로 도와 드리겠습니다.

인사말 마르쿠스

+0

안녕 마르쿠스, 쓰기를위한 감사합니다. 사과드립니다. OSX 10.6.8, Xcode 4.2, 프로젝트에서 ARC를 사용하고 있습니다. 대상은 iPad 2이고 iOS 5.0.0입니다. –

+0

문제는 테이블의 내용이 블리자드 된 것으로 밝혀졌으며 배열의 내용과 함께 테이블에 무엇을 넣을 지 알 수있었습니다. 'docs'라는 배열은 'nil'되었으므로 [docs count]는 '0'이 아닌 'nil'을 반환 했으므로 selectRowAtIndexPath에 도달하면 'nil'행이 있기 때문에 ' '0'행이 아닙니다. –

+0

'nil'개체가 충돌하지 않고 메시지를 받도록하는 것은 ObjectiveC의 근본적인 실수입니다. 왜냐하면 반환 개체의 형식을 int에서 nil로 변경하기 때문입니다. [docs count] 줄에서 충돌이 발생했다면 문제가있는 곳을 정확히 알고 있었을 것입니다. 다른 방법으로는 완전히 알려지지 않았을 것입니다. –

관련 문제