2012-07-05 2 views
1

Прежде всего, я очень ценю вашу помощь.Свойство AppDelegate неожиданно установлено на нуль

Ну, я использую три объекта NSString, общие для двух видов. И эти взгляды отделяются встроенным NavigationController, я имею в виду, что я начинаю программировать с помощью SingleView.

В AppDelegate.h, я пишу

@property (weak, nonatomic) NSString *crntURL; 

@property (weak, nonatomic) NSString *crntTitle; 

@property (weak, nonatomic) NSString *crntHTML; 

для делегирования.

И в первый взгляд, у меня есть WebView и написать

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    NSString *url = [[NSString alloc] initWithString:[myWebView  stringByEvaluatingJavaScriptFromString:@"document.URL"]]; 
    NSString *title = [[NSString alloc] initWithString:[myWebView stringByEvaluatingJavaScriptFromString:@"document.title"]]; 
    NSString *html = [[NSString alloc] initWithString:[myWebView stringByEvaluatingJavaScriptFromString:@"document.all[0].outerHTML"]]; 
    appDelegate.crntTitle = nil; 
    appDelegate.crntTitle = [[NSString alloc] initWithString:title]; 
    appDelegate.crntHTML = nil; 
    appDelegate.crntHTML = [[NSString alloc] initWithString:html]; 
    appDelegate.crntURL = nil; 
    appDelegate.crntURL = [[NSString alloc] initWithString:url]; 
} 

Вот, когда я ставлю NSLog, ожидаемый исходный HTML-код сбрасывается.

И во второй точке зрения (подкласс UIViewController), я пишу

- (void)viewDidLoad 
{ 
    // Do any additional setup after loading the view. 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    sourceHTML.text = appDelegate.crntHTML; 
    NSLog(@"%@", appDelegate.crntHTML); 
    NSLog(@"%@", appDelegate.crntURL); 
    NSLog(@"%@", appDelegate.crntTitle); 
    [super viewDidLoad]; 
} 

и только crntHTML неожиданно устанавливаются в нуль, а crntURL и crntTitle сохранить значение.

Есть ли у вас идеи?

Заранее спасибо.

Масару

+0

Почему все звонки на '[NSString initWithString]'? Первые несколько, вероятно, хорошо, но последние три полностью избыточны. – Mac

+0

Первые несколько полностью избыточны. Локальные переменные неявно '__strong', поэтому бизнес' alloc'/'initWithString' вам не нужен, чтобы справиться с ссылкой. Если вы хотите убедиться, что одна из ваших переменных содержит отдельную копию строки, лучше использовать 'copy'. – rickster

ответ

1

Вы заявили свои свойства в приложение делегата слабым. Используя ARC, объект будет выпущен и настроен на нуль, если нет сильной ссылки на него.

Я мог предположить, что вы ссылаетесь на переменную заголовка и URL-адреса с первого контроллера представления, но переменная HTML ссылается только на второй контроллер представления. Когда вы будете готовы показать HTML во втором контроллере, он уже выпущен, поскольку делегат приложения не поддерживает его.

Попробуйте изменить декларации собственности в приложение делегата сильным:

@property (strong, nonatomic) NSString *crntURL; 
@property (strong, nonatomic) NSString *crntTitle; 
@property (strong, nonatomic) NSString *crntHTML; 
+0

Мне очень жаль опаздывать. Благодарим вас за ваши объяснения. –

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