UIWebView loadRequest, вызывающий сбой в симуляторе - PullRequest
0 голосов
/ 28 марта 2011

Поэтому я пытаюсь загрузить простой URL-адрес (http://www.google.com) в веб-представление. У меня было это в приложении, с которым я работал, но я свел его к базовому приложению, чтобы удалить другие переменные. У меня есть абсолютныйминимальная настройка приложения, один контроллер представления с веб-представлением в качестве основного вида. Для кода у меня есть

-(void)viewDidLoad
{
    [super viewDidLoad];

    UIWebView *webView = (UIWebView*)self.view;
    NSMutableString *urlString = [[NSMutableString alloc] initWithString:@"http://www.google.com"];
    NSURL* url = [[NSURL alloc] initWithString:urlString];
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
    NSLog(@"Sending web request to %@", urlString);

    [webView loadRequest:urlRequest];

    [urlRequest release];
    [url dealloc];
    [urlString dealloc];
}

И при загрузке я получаю аварийное завершение EXC_BAD_ACCESS в веб-потоке. Я не уверен, если этопроблема связана с тем, что я работаю в симуляторе, или что-то я просто облажался с установкой.

1 Ответ

3 голосов
/ 28 марта 2011

НЕ ЗВОНИТЕ dealloc. Позвоните release на url и urlString вместо.

Это потому, что другие объекты имеют ссылки на эти объекты, и когда вы говорите dealloc, вы явно уничтожаете их. Это вызывает EXC_BAD_ACCESS, потому что когда другие объекты пытаются получить доступ к объектам url и string, они уже уничтожены.

Вот и весь смысл подсчета ссылок. Вы сделали с этими объектами, поэтому, если вы скажете:

[url release];
[urlString release];

Вы заявляете об этом. Это уменьшает количество ссылок на эти объекты. Но наверху вы сказали:

NSURL* url = [[NSURL alloc] initWithString:urlString];

Это означает, что url, вероятно, имеет ссылку на эту строку. Так что это бы retain отредактировало его, когда вы его создали. Поэтому после того, как вы отпустите строку, она не будет уничтожена, поскольку url все еще имеет ссылку на нее. Когда ИТ-отдел покончит с ним, он тоже освободит его, а затем (если никто больше не претендует на объект) автоматически изменится на dealloc, потому что его счетчик упадет до нуля.

Всегда имейте в виду, кто еще может использовать ваши объекты, когда вы имеете дело с такого рода управлением памятью. Вы можете прочитать больше об этом в Документах Apple .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...