Почему это вызывает утечки памяти? - PullRequest
1 голос
/ 03 сентября 2011

Я новичок в Objective-C, и я прочитал некоторые статьи по управлению памятью, но у меня возникли проблемы.

У меня есть класс примерно такой:

-(UIWebView*)getWebView{
    //UIWebView* webview = [UIWebView initWithFrame:self.frame];  edited,the original wrong line
    UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame]; 
    return webview; 
}
-(void)addToSelf{
    UIWebView* view = [self getWebView];
    [self addSubview:view];
    [view release];  //release here
}

Вмоя мысль, объекты objc все похожи на указатели C (это так?) и мыслить так:

UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame];  //retain +1
UIWebView* view = [self getWebView];  //just a pointer to the same object ?
[self addSubview:view]; //retain +1
[view release];   //retain -1

Теперь посмотрите на retainCount = 1.Тогда этот viewController будет обрабатывать жизненный цикл веб-просмотра.

Должно быть, что-то не так с моей мыслью (обязательно код), * ​​1012 *, но я не знаю, почему .

UIWebView* webview = [[[UIWebView alloc] initWithFrame:self.frame] autorelease];

Когда я удаляю последнюю строку выпуска, код работает нормально, почему? В чем разница?

-------------- строка редактирования ---------------

Несколько минут назад, есть ответ об этом, но он исчез, теперь я переписываю свою мысль:

Ответ говорит:

При возврате объекта из метода я должен использовать autorelease , чтобы сообщить компилятору, что с этим покончено, а затем с помощью addSubview завершить (не нужно выпускать).

Я знаю, что это правильно, но почему это правильно?

В большинствекодов:

-(void)someMethod{
    UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame]; 
    [self addSubview:webview];
    [webview release];
}

это работает нормально, но если разделить код на два метода, таких как top, это не так.

Почему я должен использовать autorelease при возвратеобъект?

Ответы [ 3 ]

4 голосов
/ 03 сентября 2011

Выглядит так, как будто вы не выделяете UIWebView:

UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame];

Это означает, что у вас, вероятно, нет действительного UIWebView и счетчика сохранения, который не определен, поскольку код для UIWebViewфактически используя какой-то неизвестный кусок памяти.Если это работает, вам повезло.

1 голос
/ 03 сентября 2011

Ваше общее представление о том, как удерживает и отпускает баланс друг друга, верно. Когда вы удаляете этот последний удерживающий вызов, вы пропускаете. Это дефект, который не будет заметен, если вы не наблюдаете использование памяти. (Утечки важны на любом компьютере, но оказывают большее влияние на портативные устройства.)

На практике, если метод создает (alloc) и возвращает объект, autorelease it. Затем вызывающая сторона может просто использовать этот объект и не беспокоиться о его времени жизни.

0 голосов
/ 03 сентября 2011

* # 1: метод, который «alloc» должен отвечать за вызов операторов release для объекта.

# 2: Когда вы создаете отдельный метод для выделения объекта для вас, у вас не может быть оператора «release», так как он освободит объект даже до того, как метод сайта вызова использует его. Следовательно, вместо вызова release мы вызываем autorelease и, таким образом, подчиняемся принципу # 1, но все же позволяем call-site использовать объект. Так как call-site не делал никаких выделений, ему также не нужно беспокоиться о каких-либо выпусках. ***

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