2012-07-16 1 views
0

3 일 동안 고치려는 문제로 어려움을 겪고 있습니다. 도움이 필요합니다.iOS5에서 NSObject를 선택하는 것은 UITableView = EXC_BAD_ACCESS입니다.

내 TicketTableViewController.m 파일에서 각 Ticket 값이있는 사용자 지정 NSObject (Ticket)의 NSMutableArray를 만듭니다.

Ticket *ticketFound = [[Ticket alloc] initWithTicketNumber:ticketString locationNumber:locationString clerkNumber:clerkString approvedState:approvedState approvedDetail:approvedDetail totalNumber:[totalString floatValue] tipNumber:[tipString floatValue] balanceNumber:[subtotalString floatValue] ticketItemsArray:nil ticketItemsDict:nil]; 

티켓의 승인 상태에 따라 배열에 추가합니다.

if ([approvedState isEqualToString:@"approved"]) { 
     [self.approvedTickets addObject:ticketFound]; 
    } 
    else if ([approvedState isEqualToString:@"declined"]) { 
     [self.declinedTickets addObject:ticketFound]; 

    } 
    else if ([approvedState isEqualToString:@""]){ 
     [self.openTickets addObject:ticketFound]; 
    } 
그때는 NSDictionary의 이러한 배열을 추가 해요

다음 this tutorial에 따라 글로벌 NSArray *tickets에 ; 이 글로벌 NSArray *tickets 세트

NSDictionary *openDict = [NSDictionary dictionaryWithObject:self.openTickets forKey:@"tickets"]; 
NSDictionary *decDict = [NSDictionary dictionaryWithObject:self.declinedTickets forKey:@"tickets"]; 
NSDictionary *approvDict = [NSDictionary dictionaryWithObject:self.approvedTickets forKey:@"tickets"]; 

[self.tickets addObject:openDict]; 
[self.tickets addObject:decDict]; 
[self.tickets addObject:approvDict]; 

, 나는 그 (튜토리얼에 따라)를 구분 jQuery과의 모든 티켓을 표시 할 수 있습니다. 배열의 각 티켓에서 정보를 가져 와서 표시하는 사용자 지정 셀을 사용하고 있습니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"TicketCell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

NSDictionary *dictionary = [self.tickets objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"tickets"]; 
Ticket *ticket = [array objectAtIndex:indexPath.row]; 

UILabel *locationLabel = (UILabel *)[cell viewWithTag:100]; 
locationLabel.text = [NSString stringWithFormat:@"Location: %@", ticket.locationNumber]; 
UILabel *ticketLabel = (UILabel *)[cell viewWithTag:101]; 
ticketLabel.text = [NSString stringWithFormat:@"Ticket: %@", ticket.ticketNumber]; 
UILabel *balanceLabel = (UILabel *)[cell viewWithTag:102]; 
balanceLabel.text = [NSString stringWithFormat:@"$%.2f", ticket.balanceNumber]; 

return cell; } 

이것은 완벽하게 작동합니다 (문제는 해결되지만 일단 해결할 다른 문제 임에도 불구하고). 내 문제는 다음 사용자가 UITableView에서 티켓을 선택하면 온다. 내가 선택한 행의 티켓에서 데이터의 일부를 호출하려고 시도하면 EXC_BAD_ACCESS 오류로 앱이 다운됩니다. 여기 내 코드가있다.

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

NSDictionary *dictionary = [self.tickets objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"tickets"]; 
Ticket *ticket = [array objectAtIndex:indexPath.row]; 

NSLog(@"float: %@", ticket.balanceNumber); //this causes the crash } 

나는 내가 NSLog(@"class: %@", [ticket class]);를 넣어 경우 때문에 티켓 (NSObject의)를 반환하고 티켓 (NSObject의)를 반환 Ticket *ticket...id ticket...에 변경 해요 알고있다.

나는 모든 조언을 주셔서 감사합니다.

미리 감사드립니다.

감사합니다,

편집 :이 날 float를 반환하기 위해 노력하고 %@보다는 %f를 사용하여 아무 없다 - 나는 문자열, 응용 프로그램이 충돌되는 NSLog(@"ticketNumber: %@", ticket.ticketNumber);을 시도 할 경우에도 있습니다.

+0

%를 사용하지 않으므로 충돌 할 수 있습니다.NSLog 문에서 2f. –

+0

또한 티켓 배열에 배열을 만들면 어떨까요? 나는 왜 당신이 사전에 넣는 지 알지 못한다. 그것은 불필요한 여분의 단계처럼 보인다. 그냥 [self.tickets objectAtIndex : [indexPath.section]]'이 임의의 사전을 거기에 추가하는 추가 단계를 거치지 않고 배열을 반환하도록하십시오. –

+0

그러나 섹션에 표시 할 다른 배열을 어떻게 분리합니까? 튜토리얼을 사용하고 워크 플로우가 이전보다 훨씬 더 엄격 해 보였기 때문에 NSDictionary 만 사용했습니다. –

답변

0

나는 그것을 작동시켰다! 나는 그 속성에 대한 내 사용자 정의 NSObject 클래스에서 retain 대신 assign을 사용하고있었습니다. 도와 주셔서 감사합니다.

+0

에 오신 것을 환영합니다. 나중에 방문하는 사람들을 위해 나중에 대답을 수락하는 것을 잊지 마십시오. – Shahbaz

0

어떤 유형이 balanceNumber입니까? 당신은 % @을 가진 숫자를 출력하고/로깅하고 있습니까? double이면 % lf를 시도합니까

0

Ticket 클래스 "balanceNumber"의 속성은 float이거나 10 진수이므로 nsLOG는 이렇게 될 : 당신이 당신의 프로세스 공간 외부 메모리에 액세스 할 때

일반적으로
if float: 

NSLog(@"float: %f", ticket.balanceNumber); 

if decimal: 


NSLog(@"float: %d", ticket.balanceNumber); 
+0

오스카 답장을 보내 주셔서 감사합니다. 미안해, 내가 분명하게해야 해. 문자열 인 ticket.ticketNumber를 호출하려고해도 앱이 다운됩니다. –

0

, EXC_BAD_ACCESS이 발생, 중 메모리가 해제 된 또는 포인터가 프로세스 공간 외부 어딘가를 가리 키도록 손상되어 있기 때문이다. 이 프로젝트에 ARC를 사용하고 있는지 여부는 언급하지 않았으므로 가능한 범인이 무엇인지에 영향을 미칩니다. 어느 쪽이든, 나는 NSZombieEnabled으로 달려 가서 도움이되는지 확인합니다.