2012-03-19 4 views
1

У меня есть подкласс UIViewController с UIWebView. Он добавляет, что веб-представление, поскольку оно является подзоном просмотра, и в dealloc выпускает его. Вот соответствующий код:Вывод UIWebView вызывает сбой

#import "MediaVC.h" 

@implementation MediaVC 
@synthesize file, repository, server, delegate; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    webView = [[UIWebView alloc] initWithFrame:[[self view] bounds]]; 
    [webView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; 
    [webView setScalesPageToFit:YES]; 
    [webView setMultipleTouchEnabled:YES]; 

    [[self view] addSubview:webView]; 

    [self displayFile]; 


    [flex release]; 
    [buttonDone release]; 
    [buttonAction release]; 
} 


- (void)displayFile { 

    if (!mimeString) { 
     [webView loadData:nil 
       MIMEType:nil 
     textEncodingName:nil 
        baseURL:nil]; 


     [SVProgressHUD dismissWithError:@"Can't display this file." afterDelay:2]; 
    } else { 

     [[DataCenter sharedInstance] getDataForFile:file 
              server:server 
             repository:repository 
              isThumb:NO 
             completion:^(NSData *data) { 

              NSString *filenamePath =[NSString stringWithFormat:@"temp.%@", [[file path] pathExtension]]; 
              NSString *docDir = [DataCenter getDocumentsDirectoryPath]; 

              NSString *fullPath = [docDir stringByAppendingPathComponent:filenamePath]; 

              [data writeToFile:fullPath atomically:YES]; 

              [webView loadData:data 
                 MIMEType:[DataCenter mimeTypeForFile:file] 
               textEncodingName:nil 
                 baseURL:nil]; 

              if (!data) { 
               [SVProgressHUD dismissWithError:@"Error!"]; 
              } else { 
               [SVProgressHUD dismiss]; 
              } 

             } progress:^(float progress) { 
              [SVProgressHUD setFloat:progress]; 
             }]; 


    } 

} 

- (void)dealloc { 
    [buttonNext release]; 
    [buttonBack release]; 
    //[webView release]; ---CRASH HAPPENS IF I UNCOMMENT THIS LINE 
    [super dealloc]; 
} 

@end 

Приложение аварийно завершает работу [super dealloc] ;. У меня NSZombieEnabled, и он не дает мне никакой ошибки относительно «ошибки, отправленной на освобожденный экземпляр ...». Я обнаружил, что если я прокомментирую [webView release],, авария не произойдет. Я проверяю, и я только выделяю UIWebView один раз и отпускаю его один раз.

ОБНОВЛЕНИЕ Полный класс ниже. Как я сказал, есть много в этом классе, что это не имеет отношения, и я не мог найти какие-либо проблемы в этом, может быть, вы, ребята, найти что-то:

#import "MediaVC.h" 
#import "DataCenter.h" 
#import "SVProgressHUD.h" 
#import "File.h" 

@implementation MediaVC 
@synthesize file, repository, server, delegate; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIBarButtonItem *buttonDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                       target:self 
                       action:@selector(done)]; 

    UIBarButtonItem *buttonAction = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction 
                        target:self 
                        action:@selector(action:)]; 


    buttonNext = [[UIBarButtonItem alloc] initWithTitle:@"Next" 
                style:UIBarButtonItemStyleDone 
               target:self 
               action:@selector(next)]; 

    buttonBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                style:UIBarButtonItemStyleDone 
               target:self 
               action:@selector(back)]; 

    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                      target:nil 
                      action:nil]; 


    [[self navigationItem] setLeftBarButtonItem:buttonDone]; 
    [[self navigationItem] setRightBarButtonItem:buttonAction]; 
    [[self navigationController] setToolbarHidden:NO]; 
    [self setToolbarItems:[NSArray arrayWithObjects:buttonBack, flex, buttonNext, nil] animated:YES]; 



    webView = [[UIWebView alloc] initWithFrame:[[self view] bounds]]; 
    [webView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; 
    [webView setScalesPageToFit:YES]; 
    [webView setMultipleTouchEnabled:YES]; 

    [[self view] addSubview:webView]; 

    [self displayFile]; 


    [flex release]; 
    [buttonDone release]; 
    [buttonAction release]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

- (void)done { 
    [delegate doneMediaVC:self]; 
} 

- (void)action:(id)button { 
    NSString *filenamePath = [file path]; 
    NSString *docDir = [DataCenter getDocumentsDirectoryPath]; 

    NSString *fullPath = [docDir stringByAppendingPathComponent:filenamePath]; 

    NSURL *url = [NSURL fileURLWithPath:fullPath]; 
    UIDocumentInteractionController *c = [UIDocumentInteractionController interactionControllerWithURL:url]; 
    BOOL success = [c presentOpenInMenuFromBarButtonItem:buttonBack animated:YES]; 
    if (!success) { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"An application cannt be found to open this file" 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil, nil]; 
     [alertView show]; 
     [alertView release]; 
    } 
} 

- (void)displayFile { 

    [self setTitle:[file name]]; 

    [SVProgressHUD showInView:[[self navigationController] view] 
         status:@"Loading..." 
      networkIndicator:YES 
        progress:YES]; 

    NSString *mimeString = [DataCenter mimeTypeForFile:file]; 


    if (!mimeString) { 
     [webView loadData:nil 
       MIMEType:nil 
     textEncodingName:nil 
        baseURL:nil]; 


     [SVProgressHUD dismissWithError:@"Can't display this file." afterDelay:2]; 
    } else { 

     [[DataCenter sharedInstance] getDataForFile:file 
              server:server 
             repository:repository 
              isThumb:NO 
             completion:^(NSData *data) { 

              NSString *filenamePath =[NSString stringWithFormat:@"temp.%@", [[file path] pathExtension]]; 
              NSString *docDir = [DataCenter getDocumentsDirectoryPath]; 

              NSString *fullPath = [docDir stringByAppendingPathComponent:filenamePath]; 

              [data writeToFile:fullPath atomically:YES]; 

              [webView loadData:data 
                 MIMEType:[DataCenter mimeTypeForFile:file] 
               textEncodingName:nil 
                 baseURL:nil]; 

              if (!data) { 
               [SVProgressHUD dismissWithError:@"Error!"]; 
              } else { 
               [SVProgressHUD dismiss]; 
              } 

             } progress:^(float progress) { 
              [SVProgressHUD setFloat:progress]; 
             }]; 


    } 

    if (![delegate canGoNext:self currentFile:file]) { 
     [buttonNext setEnabled:NO]; 
    } else { 
     [buttonNext setEnabled:YES]; 
    } 


    if (![delegate canGoPrevious:self currentFile:file]) { 
     [buttonBack setEnabled:NO]; 
    } else { 
     [buttonBack setEnabled:YES]; 
    } 
} 

- (void)back { 
    [self setFile:[delegate getPreviousFileForMediaVC:self currentFile:file]]; 
    [self displayFile]; 
} 

- (void)next { 
    [self setFile:[delegate getNextFileForMediaVC:self currentFile:file]]; 
    [self displayFile]; 
} 

- (void)dealloc { 
    [buttonNext release]; 
    [buttonBack release]; 
    //[webView release]; 
    [super dealloc]; 
} 

@end 

Спасибо!

+1

Нет ничего плохого в распределении и выпуске переменной webview. Возможно, вы создали сохраненное свойство, сопоставленное с webview? Если нет, что-то еще должно быть причиной аварии. –

+0

@PhilippeLeybaert, глядя на количество недостающего кода, многое может быть неправильным с фактическим кодом. – mvds

+0

Я знаю, поэтому я сказал, что нет ничего плохого в распределении/выпуске переменной, и что-то другое, вероятно, вызывает проблему. –

ответ

7

Вы видите эту строку в документации?

Важен Перед выпуском экземпляра UIWebView, для которого у вас есть установить делегат, вы должны сначала установить его свойство делегата к нулю. Этот может быть выполнен, например, в вашем методе dealloc.

Ваш «соответствующий код» не показывает, как вы устанавливаете делегата, но опять же ваш соответствующий код не является полным. (flex? buttonDone? buttonAction?)

Просьба поделиться все код, если вы хотите получить хороший ответ.

+0

Я только что вставил amy полный класс в оригинальном вопросе. – 0xSina

Смежные вопросы