iPhone: сбой в пользовательском пуле автоматического выпуска - PullRequest
0 голосов
/ 14 июня 2010

Мое приложение падает, когда я пытаюсь опубликовать изображения в HTTP-запросе.Я пытаюсь загрузить изображения на сервер.Похоже, что сбой связан с моим пулом автоматического выпуска, потому что сбой зафиксирован в сообщении [pool release].

Вот отчет о сбое:

#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

В отчете о сбое говорится, что последняя строка следующего кода является точкой сбоя.(Строка № 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
}

Я не понимаю, что является причиной аварии.

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Здесь вам не нужен специальный пул автоматического выпуска.Если вы не сохраняете десятки изображений одновременно (маловероятно), локальный пул не нужен.

Нет особого смысла в создании пула автоматического выпуска вне цикла, так как цикл в любом случае охватывает весь метод.Если вам нужен собственный пул, вы должны поместить его в цикл, чтобы он очищал память для каждого прохода через цикл.

Авария может не иметь прямого отношения к пулу, но отладчик перехватывает ее.Чтобы начать отладку, закомментируйте пул автоматического выпуска и его сток.Это, вероятно, раскроет источник крушения.

Как хорошее эмпирическое правило.Не создавайте локальный пул, пока не протестируете сегмент кода и не определите, что он нужен.Лишь в редких случаях это необходимо, и только тогда, когда вы создаете большое количество объектов в небольшом объеме.

0 голосов
/ 14 июня 2010

На основании вашего отчета о сбое сложно определить причину сбоя. Не уверен, что вы можете использовать NSLog для получения отладочной информации (по крайней мере, в ваших примерах кода)? NSLog - это функция для вывода сообщений на консоль вывода. Это отличный инструмент, чтобы узнать, где происходит сбой.

...