尝试在xcode中创建类的对象时出现EXC_BAD_ACCESS错误

0 iphone xcode objective-c

当我尝试创建方法的实例时,我收到EXC_BAD_ACCESS错误.

UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(40,38,240,203)];
DetailImageViewDataSource *detail=[[DetailImageViewDataSource alloc] init];//**error line**

@implementation DetailImageViewDataSource


@synthesize webdata,xmlParser,soapResults,newImage;
-(void) startParsing
{
    recordResults=FALSE;
    NSString *soapMessage=[NSString stringWithFormat:
                           @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                           "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                           "<soap:Body>\n"
                           "<GetImage xmlns=\"http://tempuri.org/\">\n"
                           "<imageID>f89df9ad-5a5d-4354-895f-356d8ce4ccfb</imageID>\n"
                           "</GetImage>\n"
                           "</soap:Body>\n"
                           "</soap:Envelope>\n"];


//http://192.168.2.7/ImageWebService/Service1.asmx
//http://192.168.2.7/ThesisWebServicesNew1/Service.asmx
NSLog(soapMessage);
NSURL *url=[NSURL URLWithString:@"http://192.168.2.7/ThesisWebServicesNew1/Service.asmx"];
NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:url];
NSString *msgLength=[NSString stringWithFormat:@"%d",[soapMessage length]];

[theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue:@"http://tempuri.org/GetImage" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

if(theConnection)
{
    webdata=[[NSMutableData data] retain];

    NSLog(@"got connected");
}

else
{
    NSLog(@"No Cnnection");
}

//[nameinput resignFirstResponder];
Run Code Online (Sandbox Code Playgroud)

}

初始化代码

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

        // Custom initialization
    }

    UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(40,38,240,203)];

    [img setImage:[UIImage imageNamed:@"LARCbackground.png"]];

    UITableView *tableView1=[[UITableView alloc] initWithFrame:CGRectMake(20,266,280,136) style:UITableViewStylePlain];
    [tableView1 setDelegate:self];
    [tableView1 setDataSource:self];
    [tableView1 setAlpha:0.75];
    [tableView1 setBackgroundColor:[UIColor clearColor]];

    [[self view] addSubview:tableView1];
    [tableView1 dealloc];
    [[self view] addSubview:img];
    [img dealloc];
    //[imageView setImage:];


    //[[self view] addSubview:imageView];
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我在这里应用了一个断点,当我点击继续时,我得到了exe_bad_access错误.

我正在尝试创建一个xmlparser类的对象.

已经持续了好几个小时......没有成功.请帮忙..

bbu*_*bum 16

这段代码存在很多问题,其中任何一个都可能导致崩溃.很难说没有看到回溯.

  1. 您的初始化程序错误:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
        if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    
        // Custom initialization
        }
    
        UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(40,38,240,203)];
    
        ....
        return self;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    你不应该在if和return之间有任何代码.如果对super的调用失败会怎么样?在您的代码中,无论如何都将继续初始化实例.那肯定会打破.

  2. 您对NSLog()的调用是危险的:

    NSLog(soapMessage);
    
    Run Code Online (Sandbox Code Playgroud)

    如果soapMessage碰巧包含一个%@%s,那就保证会崩溃.

  3. 你是-dealloc直接调用的.两次.将要释放的对象添加到视图层次结构后立即执行.

    [[self view] addSubview:tableView1];
    [tableView1 dealloc];
    [[self view] addSubview:img];
    [img dealloc];
    
    Run Code Online (Sandbox Code Playgroud)

    这肯定会导致崩溃,因为解除分配的对象现在位于视图层次结构中.一旦你的应用尝试渲染任何东西,***BOOM****.

    永远不应该-dealloc直接打电话.(你的意思是-release,对吧?)

  4. 在评论中,你说崩溃就行了DetailImageViewDataSource *detail=[[DetailImageViewDataSource alloc] init];.该行未出现在粘贴的源中.同样,所有的初始化逻辑都在-initWithNibName:bundle:.

    您确定您的对象正确初始化吗?

修复所有这些,然后查看您的崩溃是否仍然发生.如果是,请发布崩溃的堆栈跟踪.