简要概述我正在尝试做什么。
我在我的UITableViewController子类中使用tableView:didSelectRowAtIndexPath:方法,它正在从该视图中捕获行选择,如此...
//..... 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
正如你在这个方法中看到的,我设置了一些东西,将新视图推送到视图堆栈并更改后退按钮文本,然后我进入捕获不同的行,然后在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);
}
从这里我想将我从requestFinished方法获得的数据传递回新推出的UITableView ..但是我有一个错误,我能够做到这一点,我需要解决...如果我运行模拟器并在视图之间来回点击(主要的UITableViewController与单元格,然后是我想要放置数据的新弹出视图)应用程序崩溃并在 main.m <中弹出错误/ strong>线程1:程序接收信号EXC_BAD_ACCESS ..我只是不知道是什么造成的,因为我可以告诉我的代码并不是那么糟糕。
另外,当我调试我的应用程序时,我注意到一旦grabURLInBackground方法完成它就会跳回到getMans方法,然后返回到UITableViewController并继续通过if语句,完全忽略了requestFinished和requestFailed方法,而我只是无法弄清楚原因。
我想我不确定我是否正在调用我需要在正确位置使用的方法和功能,所以如果你对我如何改进有任何建议或答案,或者如果你知道我的错误将来自何处非常感谢。
答案 0 :(得分:1)
上面的代码有一些问题,但我猜你的错误访问异常是由于你的EngineRequests的处理和使用AsiHttpRequest。
这里的代码
EngineRequests *engineRequest = [[EngineRequests alloc] init];
[engineRequest getMans];
[engineRequest release];
有效地创建一个对象,然后在getMans运行完毕后立即解除分配。
然后在engineRequest对象此代码
内[request setDelegate:self];
[request startAsynchronous];
请求完成后,请求AsiHttpRequest 通知几乎肯定已发布的对象。
这里可能还有其他问题,但我会从重组开始尝试保持这个对象,至少在收到AsiHttpRequest的响应之后。
答案 1 :(得分:0)
很难从简短的概述中看出,但通常当你bad_access并最终进入主应用程序方法时,通常是因为你自动释放了一些东西,然后释放它,并且当自动释放池被耗尽时它会崩溃。可能想打开NSZombiesEnabled并寻找内存问题。
答案 2 :(得分:0)
谁接到您的请求?
发送方(和接收方)对象是engineRequest。 但是在你发出异步请求之后的那一刻你发布了Engine Request(由getMans方法提供。)
我会建议你 1.移动代码
vehicleSearchResponseTableViewController.title = @"Mans";
EngineRequests *engineRequest = [[EngineRequests alloc] init];
[engineRequest getMans];
[engineRequest release];
从您的UITableViewController's
didSelectRowAtIndexPath方法到vehicleSearchResponseTableViewController
的{{1}}方法。
2.保留viewDidLoad
对象并将其保留在EngineRequests
中的某个实例变量中,并且在请求完成处理之前不要成功或错误地释放它。