gpt4 book ai didi

ios - 下载任务中的AFNetworking EXC_BAD_ACCESS(代码= 2,地址= 0x0)

转载 作者:行者123 更新时间:2023-12-01 18:15:20 25 4
gpt4 key购买 nike

我有一个应用程序,可在登录后为客户编译客户特定报告的列表。这些报告正在显示,我已经放置了一个“查看”按钮,该按钮应该可以下载PDF文件,并在应用程序中显示它。

在此阶段,按下查看按钮时似乎出现了内存问题,并且我不确定如何找到问题所在。这是我的代码:

#import "reportsTestViewController.h"
#import "ReportsDataObject.h"
#import "Session.h"
#import "AFNetworking.h"
@interface reportsTestViewController ()

@end

@implementation reportsTestViewController

@synthesize response;

@synthesize myDataIvar;

@synthesize viewReportPressed;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
reportsTable.delegate = self;
reportsTable.dataSource = self;
self.sections = [[NSMutableDictionary alloc] init];

[super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

#pragma mark NSURLConnection Delegate Methods
//

//Create your request pointing to the test page
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.tesg.com.au/allCustBuild.php"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];


NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

//initialize it when you create your connection
if (connection){
self.myDataIvar = [[NSMutableData alloc] init];
}
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
[self.myDataIvar setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[self.myDataIvar appendData:data];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"Connection Failed: %@", error.userInfo);
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//this is where you would parse the data received back from the server
NSString *responseString = [[NSString alloc] initWithData:self.myDataIvar encoding:NSUTF8StringEncoding];
NSLog(@"Received Data: %@",responseString);
[self setupReportsFromJSONArray:self.myDataIvar];

}

-(void)connectionWasASuccess:(NSData *)data{
[self setupReportsFromJSONArray:data];

}



-(void)setupReportsFromJSONArray:(NSData*)dataFromReportsArray{
BOOL found;
NSError *error;
// NSMutableArray *reportsArray = [[NSMutableArray alloc] init];
NSArray *arrayFromServer = [NSJSONSerialization JSONObjectWithData:dataFromReportsArray options:0 error:&error];

if(error){
NSLog(@"error parsing the json data from server with error description - %@", [error localizedDescription]);
}

else {
reportsArray = [[NSMutableArray alloc] init];
for(NSDictionary *eachReport in arrayFromServer)
{

ReportsDataObject *report = [[ReportsDataObject alloc] initWithJSONData:eachReport];

[reportsArray addObject:report];
NSString *c = [[eachReport objectForKey:@"title"] substringToIndex:3];
found = NO;

for (NSString *str in [self.sections allKeys])
{
if ([str isEqualToString:c])
{
found = YES;
}
}

if (!found)
{
[self.sections setValue:[[NSMutableArray alloc] init] forKey:c];
}
}

}
NSLog(@"Array Populated");
NSLog(@"%u reports found",reportsArray.count);
//Now you have your reportsArray filled up with all your data objects



for (NSDictionary *eachReport in arrayFromServer)
{
[[self.sections objectForKey:[[eachReport objectForKey:@"title"] substringToIndex:3]] addObject:eachReport];
}

// Sort each section array
for (NSString *key in [self.sections allKeys])
{
[[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]];


}

[reportsTable reloadData];
}


-(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

-(void)viewReportPressed:(UIButton*)button {

NSLog(@"Button successfully Pressed");
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://tesg.com.au/portal/media/reports/1367365180_367 Collins Passive April 2013.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *theResponse) {
NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]];
return [documentsDirectoryPath URLByAppendingPathComponent:[theResponse suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

NSUInteger count = [[self.sections allKeys] count];
NSLog(@"Number of sections: %d", count);
return count;
}




- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return [[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//We check against table to make sure we are displaying the right number of cells
// for the appropriate table. This is so that things will work even if one day you
//decide that you want to have two tables instead of one.

{
NSUInteger count = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section]] count];
NSLog(@"Number of rows in section: %d", count);
return count;
}
}
//- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
//return [[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
// }





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

{


static NSString *cellIdentifier = @"Cell";



UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell)
{


cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

}

//The beauty of this is that you have all your data in one object and grab WHATEVER you like
//This way in the future you can add another field without doing much.
NSUInteger count = [[self.sections allKeys] count];
if(count == 0){
cell.textLabel.text = @"no reports to show";
}
else{
NSDictionary *Reports = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

cell.textLabel.text = [Reports objectForKey:@"title"];
cell.detailTextLabel.text = [Reports objectForKey:@"building"];








UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self action:@selector(viewReportPressed:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"View" forState:UIControlStateNormal];

button.frame = CGRectMake(180.0f, 5.0f, 150.0f, 30.0f);
[cell addSubview:button];


// in the future you can grab whatever data you need like this
//[currentReport buildingName], or [currentReport reportName];
}


return(cell);

}




@end

当在任何一个单元格中按下查看按钮时,我得到NSLog说“按钮成功按下”,但是在出现错误后立即崩溃
[downloadTask resume];             Thread 1:EXC_BAD_ACCESS (code=2, address=0x0)

任何想法如何解决这一问题?

最佳答案

如果获得地址为EXC_BAD_ACCESS0x0,通常意味着在不允许nil的上下文中使用了nil值。

在这种情况下,这是因为您的URL字符串无效。不允许使用空格。因此,所得的URL变量为nil,这将导致您描述的行为。您可能希望对URL字符串进行转义,例如:

NSString *URLString = @"http://tesg.com.au/portal/media/reports/1367365180_367 Collins Passive April 2013.pdf";
NSURL *URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

要在将来识别这种异常,可以使用 exception breakpoints,它通常可以帮助识别有问题的代码行。或者只是仔细检查您的代码,以防可能无意中将 nil值传递给了不接受它的方法。

但是,如果您得到的 EXC_BAD_ACCESS的值不是 0x0,则通常是尝试使用先前释放的对象的结果。 (并非总是如此,但经常出现。幸运的是,ARC使这种问题变得不那么普遍了。)显然,这里不是这种情况,但是您询问了如何识别试图使用先前释放的对象的情况。

要诊断这种情况,通常可以打开“僵尸”(请参阅​​ Running Your Application with Diagnostics)。顺便说一句,一旦完成了对僵尸的诊断,请确保将其关闭,因为您不想让僵尸保持打开状态(尤其是在生产应用程序中)。

无论如何,在这种情况下,由于地址是 0x0,所以它不是对象释放的结果,而是问题在于无效URL导致的 nil值使用不正确。

关于ios - 下载任务中的AFNetworking EXC_BAD_ACCESS(代码= 2,地址= 0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22523097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com