Утечка памяти в TWTweetComposeViewController без ARC - PullRequest
4 голосов
/ 03 февраля 2012

Я взял пример кода «твит» Apple и изменил его, чтобы он не использовал ARC ( скачайте мой проект здесь, чтобы самостоятельно проверить проблему ).На самом деле был нужен только один оператор «autorelease»:

// Set up the built-in twitter composition view controller.
tweetViewController = [[[TWTweetComposeViewController alloc] init]autorelease];

// Set the initial tweet text. See the framework for additional properties that can be set.
[tweetViewController setInitialText:@"Hello. This is a tweet."];

// Create the completion handler block.
[tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) {
    NSString *output;

    switch (result) {
        case TWTweetComposeViewControllerResultCancelled:
            // The cancel button was tapped.
            output = @"Tweet cancelled.";
            break;
        case TWTweetComposeViewControllerResultDone:
            // The tweet was sent.
            output = @"Tweet done.";
            break;
        default:
            break;
    }

    //[self performSelectorOnMainThread:@selector(displayText:) withObject:output waitUntilDone:NO];

    // Dismiss the tweet composition view controller.
    [self dismissModalViewControllerAnimated:NO];


}];

// Present the tweet composition view controller modally.
[self presentModalViewController:tweetViewController animated:YES];

Если вы отправляете твит или нажимаете кнопку «Отмена» в «tweetViewController», вы ожидаете, что tweetViewController освобожден.Вместо этого объект остается в памяти, включая прикрепленное изображение (если вы добавили его в твит).Таким образом, если пользователь пытается сделать еще один твит, память приложения увеличивается, потому что произошел утечка tweetViewController.

Как вы заметили, tweetViewController не упоминается внутри блока, поэтому он не сохраняется автоматически.

Я использовал инструменты и доказал 1 , что "[[TWTweetComposeViewController alloc] init]" вызывает утечку памяти.

Еще одна вещь, которую я пытался доказать, была "NSLog ("% @", tweetViewController); "несколько циклов выполнения после того, как контроллер был отключен.Обычно программа должна была аварийно завершиться, потому что tweetViewController не будет указывать на экземпляр TWTweetComposeViewController.Вместо этого он правильно напечатал предыдущий экземпляр, доказав утечку памяти.

Единственный способ, который я нашел, чтобы избежать этого, - это нарушение правил управления памятью:

[tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) {

    // Dismiss the tweet composition view controller using animated YES!!
    [self dismissModalViewControllerAnimated:YES];
    [tweetViewController release];

}];

Если вы отключите его без анимации, произойдет утечка памяти ... Вы заметили проблему?Я делаю что-то неправильно?Попробуйте сами и прокомментируйте, пожалуйста ... instruments showing the

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Оказывается, это известная ошибка, и она в настоящее время расследуется Apple!Я надеюсь, что это исправлено в iOS 5.1

0 голосов
/ 05 февраля 2012

Вам не нужно было release указывать это в блоке завершения, так как вы уже автоматически высвобождали его. Попробуйте удалить вызов autorelease и release после [self presentModalViewController:tweetViewController animated:YES];

...