2011-09-01 5 views
0

내가 뭘하려고하는지 간략하게 설명합니다. didSelectRowAtIndexPath : 내가있는 tableView 사용하고테이블 뷰간에 앞뒤로 전환 할 때 EXC_BAD_ACCESS 오류가 발생합니다.

이 방법에서 볼 수 있듯이과 같이 해당 뷰에서 행 선택을 잡는 내있는 UITableViewController 하위 클래스 내부의 방법을 ...

//..... inside tableView:didSelectRowAtIndexPath: 
if (indexPath.section == 0) { 
     //--- Get the subview ready for use 
     VehicleSearchResponseTableViewController *vehicleSearchResponseTableViewController = [[VehicleSearchResponseTableViewController alloc] initWithNibName:@"VehicleSearchResponseTableViewController" bundle:nil]; 
     // ... 
     //--- Sets the back button for the new view that loads 
     self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease]; 
     // Pass the selected object to the new view controller. 
     [self.navigationController pushViewController:vehicleSearchResponseTableViewController animated:YES]; 

     if(indexPath.row == 0) { 
      vehicleSearchResponseTableViewController.title = @"Mans"; 

      EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
      [engineRequest getMans]; 
      [engineRequest release]; 
     } 
     if(indexPath.row == 1) { 
//.... etc etc 

나는 몇 가지를 설정 그런 다음 viewstack에 새 뷰를 밀어 넣고 back 단추 텍스트를 변경 한 다음 다른 행을 catch 한 다음 nsobject의 하위 클래스에서 메서드를 시작하여 모든 연결/요청 작업을 수행하려고합니다.

내 NSObject 내부에는 UITableViewController에서 선택할 수있는 여러 셀에 대해 여러 가지 방법이 있습니다. 기본적으로 다른 ASIHTTPRequest 래퍼를 초기화하는 다른 문자열을 지정하여 PHP 스크립트에 연결하고 모든 데이터를 잡습니다. NSObject는 다음과 같이 보입니다. 여기에서

//.... NSObject.m 
- (IBAction) getMans 
{ 
    NSString *mansString = [[NSString alloc] initWithString:@"mans.php"]; 
    [self grabURLInBackground:mansString]; 
    [manusString release]; 
} 
//....cont.... 
//--- Connect to server and send request ---------------->> 
- (IBAction)grabURLInBackground:(NSString *)setUrlString 
{ 
    NSString *startURL = [NSString stringWithFormat:@"http://127.0.0.1:8888/CodeTest/%@", setUrlString]; 
    NSURL *url = [NSURL URLWithString:startURL]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    NSString *responseString = [request responseString]; //Pass request text from server over to NSString 
    NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; //Create NSData object for Parser Delegate and load with responseString 
    NSLog(@"stuff %@",responseData); 

} 

- (void)requestFailed:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
    NSLog(@"%@", error); 
} 

나는 내가 해결해야한다고 여기까지 얻을 수 있어요 전에 그러나 나는 오류가 나는 .. 새로 밀어 jQuery과 다시 이상 requestFinished 방법에서 무엇입니까 데이터를 전달하고 싶습니다 ... 시뮬레이터를 실행하고 앞뒤로보기 (데이터를 넣으려는 새로 팝업 된보기 및 기본 UITableViewController) 사이를 클릭하면 응용 프로그램이 넘어져 주에 오류가 발생합니다. m 스레드 1 : 프로그램 수신 신호 EXC_BAD_ACCESS .. 그냥 내 코드가 그렇게 나쁘지 않다는 것을 알기 때문에 무엇이 발생하는지 알지 못합니다.

또한 응용 프로그램을 디버깅 할 때 grabURLInBackground 메서드가 끝나면 getMans 메서드로 다시 튀어 나오고 UITableViewController로 돌아가서 if 문을 완전히 거치며 requestFinished 및 requestFailed 메서드를 완전히 무시합니다. 이유를 알 수 없습니다.

올바른 방법으로 사용해야하는 메소드와 함수를 호출하는 것이 확실하지 않은 것 같아요. 개선 할 수있는 방법에 대한 제안이나 답변이 있거나 내 오류가 어디에서 발생하는지 알고 있다면 대단히 감사하겠습니다.

답변

0

간략한 개요에서 말하기 어렵지만, 일반적으로 bad_access와 주요 응용 프로그램 방법으로 끝나면 일반적으로 뭔가를 자동으로 가져온 다음 풀어 놓았고 자동 풀이 비울 때 쓰레기가 나옵니다. NSZombiesEnabled를 켜고 메모리 문제를 찾고 싶을 수도 있습니다.

+0

Instruments 나 NSZombiesEnabled를 사용하여 좀비를 찾는 것이 이런 종류의 디버깅을 시작할 수있는 좋은 방법 일 것입니다. – gdawg

+0

아아, 지금부터 살펴 보겠습니다. Product> Analyze를 사용하여 고정 된 몇 가지 잠재적 메모리 누수를 보았습니다.하지만이 좀비를 찾으려고합니다. –

1

위의 코드에는 몇 가지 문제가 있지만 잘못된 액세스 예외는 EngineRequests를 처리하고 AsiHttpRequest를 사용하기 때문에 발생한다고 생각합니다.

여기

EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
[engineRequest getMans]; 
[engineRequest release]; 

코드는 효과적으로 객체가 즉시 getMans 실행이 완료로 할당을 취소 만듭니다.

그런 요청이 완료되면 이 거의 확실 출시 된 객체 통지 AsiHttpRequest engineRequest 객체 이 코드

[request setDelegate:self]; 
[request startAsynchronous]; 

요청 내부.

여기에 다른 문제가있을 수 있지만 적어도이 객체가 AsiHttpRequest의 응답을 수신 할 때까지이 객체를 유지하려고 재구성해야합니다.

+0

... 어떻게 이걸 고칠 수 있겠 니? –

+0

당신은 적어도 HTTP 요청이 끝날 때까지 engineRequest가 멈추는 지 확인하는 방법이 필요합니다. 나는 아마 요청을 되돌려 놓았을 때 객체 변수로 유지하고 풀어 놓은 뷰에서 engineRequest를 생성 할 것입니다. Autorelease는 아마도이 경우 디버그하기가 더 어려워 질 것입니다. – gdawg

+0

도와 주셔서 감사합니다. 이 EngineRequests를 새로운 UItableview에 넣고 부모로부터 설정 한 뷰의 제목에 따라 여러 가지 다른 결과 집합에 대해 하나의 뷰를 사용할 수 있도록 변경하려고합니다. –

0

누가 귀하의 요청을 받습니까?

발신자 (및 수신자) 개체는 engineRequest입니다. 당신이 getMans 방법의 망에 의해 (비동기 요청을 발행 한 후 는하지만 바로 그 순간에 엔진 요청을 뗍니다.

내가 제안 당신 1. 이동 코드 당신의 UITableViewController's didSelectRowAtIndexPath에서

vehicleSearchResponseTableViewController.title = @"Mans"; 

    EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
    [engineRequest getMans]; 
    [engineRequest release]; 

메서드를 vehicleSearchResponseTableViewControllerviewDidLoad 메서드 에 복사합니다. EngineRequests 개체를 유지하고 vehicleSearchResponseTableViewController의 인스턴스 변수에 유지하고 요청이 완전히 처리되기 전에 오류가 발생하지 않도록 해제하십시오.

+0

나는 당신이 의미하는 바를 안다. 그러나 그 테이블에있는 데이터는 부모보기에서 어떤 셀을 선택했는지에 대해 깊게 바뀔 수있다. 하나의 UITableViewController로 선택된 셀에 따라 다른 데이터를로드하려고합니다. –

+0

예, http 요청이 완료되기 전에 engineRequest 객체를 해제하면 가장 좋은 경우에는 데이터를받지 못하게되고 최악의 경우 잘못된 액세스가 중단 될 수 있습니다. –