2011-01-26 4 views
0

UITableView가 있고 행에 didSelectRowAtIndexPath가 호출되면 완벽하게 다음보기로 전환됩니다. 그러나 'back'buttton을 클릭하고 이전에 선택한 동일한 행을 선택하면 ... 내 앱이 다운됩니다. 다른 행을 선택하면 충돌이 발생하지 않습니다. 코드는 다음과 같습니다.동일한 행을 두 번 선택하면 UITable 충돌이 발생합니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSDictionary *tempEventDictionary = [[NSDictionary alloc]initWithDictionary:[arrayWithEvents objectAtIndex:indexPath.row]]; 
    NSLog(@"%i",tempEventDictionary); 


    //push to new view and set myArray in the cardPage 
    CardPageViewController *cardPageViewController = [[CardPageViewController alloc] init]; 
    cardPageViewController.eventDictionary = tempEventDictionary; 
    [self presentModalViewController:cardPageViewController animated:YES]; 

    [cardPageViewController release]; 
    [tempEventDictionary release]; 
} 

“EXC_BAD_ACCESS”으로 오류가 발생했습니다.

위에서 볼 수 있듯이 NSDictionary의 포인터 주소를 인쇄하고 있으며 각 indexPath.row에 대해 동일한 주소를 찾고있는 것으로 보입니다. 즉, 포인터 위치가 해제되고 동일한 indexPath.row 값으로 다시 정렬하려고하면 이전 포인터 주소가 검색되지만 아직 존재하지 않습니다. 어쩌면 여기서 완전히 틀릴 수도 있습니다. 어떤 도움을 주셔서 감사합니다.

+0

크래시의 출력은 무엇입니까? – WrightsCS

+0

출력이 없습니다. 그냥 충돌. 내 사전 autorelease를 만들려고 할 때 한 번 malloc 것을 보았다고 생각합니다. – nicholjs

+0

확실히 출력이 있습니다. gdb 콘솔을 확인하고 마지막 메시지를 붙여 넣으십시오. 또한 왜 int 형식 지정자 ("% i")를 사용하여 NSDictionary를 인쇄하고 있습니까? –

답변

1

게시 한 코드에는 아무런 문제가 없습니다. 내 생각 엔 CardPageViewController 내에서 데이터 개체 중 하나를 다시 덮어 쓰고 코드가 동일한 데이터에서 임시 사전을 다시 만들려고하면 사전 내에 할당되지 않은 개체가 발견되어 충돌이 발생합니다.

+0

옳은 것 같지만 누출을 찾을 수 없습니다. – nicholjs

0

나는이 어려운 오토 리 어스와 함께 보유 카운트가 끝나기 전에 오브젝트를 계속 유지하는 "해킹"을 가지고 있습니다. 사전을 초기화 한 다음 보유 개수가 2가되도록 설정하고 숨겨진 (내 눈에) autorelease가 프로그램을 중단시키지 않도록 설정합니다. 코드는 다음과 같습니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

//---send data to cardPage 

CardPageViewController *cardPageViewController = [CardPageViewController alloc]; 

NSDictionary *tempEventDictionary = [[NSDictionary alloc]initWithDictionary:[arrayWithEvents objectAtIndex:indexPath.row]]; 
cardPageViewController.eventDictionary = [arrayWithEvents objectAtIndex:indexPath.row]; 

[self presentModalViewController:cardPageViewController animated:YES]; 
[cardPageViewController release]; 
} 

이 릴리스 된 사전을 찾을 수없는 사람에게 도움이되기를 바랍니다.

+0

즉시'init'하지 않고'alloc'하지 마십시오. –

0

사전을 가져 와서 새보기 컨트롤러에 대한 사용자 정의 init 내에서 사전을 복사하는 사용자 정의 init을 생성하지 않는 이유는 무엇입니까?

관련 문제