views:

227

answers:

2

My app is crashing when I try to post images in an HTTP request. I am trying to upload images to a server. The crash appears related to my autorelease pool because the crash is trapped at the [pool release] message.

Here is the crash report:

#0  0x326712f8 in prepareForMethodLookup ()
#1  0x3266cf5c in lookUpMethod ()
#2  0x32668f28 in objc_msgSend_uncached ()
#3  0x33f70996 in NSPopAutoreleasePool ()
#4  0x33f82a6c in -[NSAutoreleasePool drain] ()
#5  0x00003d3e in -[CameraViewcontroller save:] (self=0x811400, _cmd=0x319c00d4, number=0x11e210) at /Users/hardikrathore/Desktop/LiveVideoRecording/Classes/CameraViewcontroller.m:266
#6  0x33f36f8a in __NSFireDelayedPerform ()
#7  0x32da44c2 in CFRunLoopRunSpecific ()
#8  0x32da3c1e in CFRunLoopRunInMode ()
#9  0x31bb9374 in GSEventRunModal ()
#10 0x30bf3c30 in -[UIApplication _run] ()
#11 0x30bf2230 in UIApplicationMain ()
#12 0x00002650 in main (argc=1, argv=0x2ffff474) at /Users/hardikrathore/Desktop/LiveVideoRecording/main.m:14

The crash report says that final line of the following code is the point of the crash. (Line No. 266)

-(void)save:(id)number
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    j =[number intValue];
    while(screens[j] != NULL){
        NSLog(@" image made : %d",j);
        UIImage * image = [UIImage imageWithCGImage:screens[j]];
        image=[self imageByCropping:image toRect:CGRectMake(0, 0, 320, 240)];
        NSData *imgdata = UIImageJPEGRepresentation(image,0.3);
        [image release];

        CGImageRelease(screens[j]);
        screens[j] = NULL;

        UIImage * image1 = [UIImage imageWithCGImage:screens[j+1]];
        image1=[self imageByCropping:image1 toRect:CGRectMake(0, 0, 320, 240)];
        NSData *imgdata1 = UIImageJPEGRepresentation(image1,0.3);
        [image1 release];

        CGImageRelease(screens[j+1]);
        screens[j+1] = NULL;
        NSString *urlString=@"http://www.test.itmate4.com/iPhoneToServerTwice.php";
        // setting up the request object now
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
        [request setURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"POST"];

        NSString *fileName=[VideoID stringByAppendingString:@"_"];
        fileName=[fileName stringByAppendingString:[NSString  stringWithFormat:@"%d",k]];
        NSString *fileName2=[VideoID stringByAppendingString:@"_"];

        fileName2=[fileName2 stringByAppendingString:[NSString  stringWithFormat:@"%d",k+1]];
        /*
         add some header info now
         we always need a boundary when we post a file
         also we need to set the content type

         You might want to generate a random boundary.. this is just the same 
         as my output from wireshark on a valid html post
         */
        NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

        /*
         now lets create the body of the post
         */
        //NSString *count=[NSString stringWithFormat:@"%d",front];;
        NSMutableData *body = [NSMutableData data];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];    
        //[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; count=\"@\"";filename=\"%@.jpg\"\r\n",count,fileName] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n",fileName] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imgdata]];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        //second boundary

        NSString *string1 = [[NSString alloc] initWithFormat:@"\r\n--%@\r\n",boundary];
        NSString *string2 =[[NSString alloc] initWithFormat:@"Content-Disposition: form-data; name=\"userfile2\"; filename=\"%@.jpg\"\r\n",fileName2];
        NSString *string3 =[[NSString alloc] initWithFormat:@"\r\n--%@--\r\n",boundary];


        [body appendData:[string1 dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[string2 dataUsingEncoding:NSUTF8StringEncoding]];
        //experiment 
        //[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile2\"; filename=\"%@.jpg\"\r\n",fileName2] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imgdata1]];
        //[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[string3 dataUsingEncoding:NSUTF8StringEncoding]]; 
        // setting the body of the post to the reqeust
        [request setHTTPBody:body];
        // now lets make the connection to the web
        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
        if([returnString isEqualToString:@"SUCCESS"])
        {
            NSLog(returnString);
            k=k+2;
            j=j+2;
            [self performSelectorInBackground:@selector(save:) withObject:(id)[NSNumber numberWithInt:j]];
        }

        [imgdata release];  
        [imgdata1 release]; 

    [NSThread sleepForTimeInterval:.01];

    }   
    [pool drain];           //<-------------Line 266
}

I don't understand what is causing the crash.

A: 

Based on your crash report, it is hard to find out why the crash was happened. Not sure if you can use NSLog to get some debug information (at least not in your example codes)? NSLog is a function to output messages to output console. It's a great tool find out where the crash is.

David.Chu.ca
+1  A: 

You don't need a custom autorelease pool here. Unless you are saving dozens of images at a time (unlikely) a local pool is unnecessary.

There is not much point creating an autorelease pool outside the loop since the loop encompasses the entire method anyway. If you did need a custom pool, you should put it inside the loop so that it cleans up the memory for each pass through the loop.

The crash may have nothing directly to do with the pool but that is simply where the debugger traps it. To start debugging, comment out the autorelease pool and its drain. That will probably uncover the source of the crash.

As a good rule of thumb. Don't create a local pool until you've test the code segment and determined it needs one. Only rarely is one needed and then only when you create large numbers of objects in a small scope.

TechZen