iOS 5 Twitter Framework и завершение блокаHandler - «Сильный захват себя» в этом блоке может привести к сохранению цикла »

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

Мой код использует iOS 5 Twitter Framework. Я использую большую часть примера кода, который предоставляет Apple, поэтому сначала я понятия не имел, что использую блок для обработчика завершения.

Теперь я получаю эти два сообщения из Xcode 4, говорящие "1. Блок будет удерживаться объектом, сильно удерживаемым захваченным объектом." а также "Сильный захват «себя» в этом блоке может привести к сохранению цикла».

По сути, я удалил код, использованный Apple в их обработчике завершения (оператор switch с TWTweetComposeViewControllerResultCancelled & TWTweetComposeViewControllerResultDone) и использовал мои операторы if с[imagePickerController sourceType].

Так чтоsendTweet вызывается после добавления изображения в твит.

Я надеюсь, что кто-то может объяснить мне, почему это происходит и как я могу решить это. Кроме того: я могу поместить код обработчика завершения в метод вместо блока?

- (void)sendTweet:(UIImage *)image
{
    //adds photo to tweet
    [tweetViewController addImage:image];

    // Create the completion handler block.
    //Xcode: "1. Block will be retained by an object strongly retained by the captured object"
    [tweetViewController setCompletionHandler:
                             ^(TWTweetComposeViewControllerResult result) {
            NSString *alertTitle,
                     *alertMessage,
                     *otherAlertButtonTitle,
                     *alertCancelButtonTitle;

            if (result == TWTweetComposeViewControllerResultCancelled) 
            {
                //Xcode: "Capturing 'self' strongly in this block is likely to lead to a retain cycle"
                if ([imagePickerController sourceType])
                {
                    alertTitle = NSLocalizedString(@"TCA_TITLE", nil);
                    alertMessage = NSLocalizedString(@"TCA_MESSAGE", nil);
                    alertCancelButtonTitle = NSLocalizedString(@"NO", nil);
                    otherAlertButtonTitle = NSLocalizedString(@"YES", nil);

                    //user taps YES
                    UIAlertView *alert = [[UIAlertView alloc] 
                                             initWithTitle:alertTitle 
                                                   message:alertMessage 
                                                  delegate:self   // Note: self
                                         cancelButtonTitle:alertCancelButtonTitle 
                                         otherButtonTitles:otherAlertButtonTitle,nil];
                    alert.tag = 1;
                    [alert show];                
                }            
            }

Ответы на вопрос(4)

Ваш ответ на вопрос