iOS 5 Twitter Framework & completionHandler block - "Capturing 'self' strongly in this block is likely to lead to a retain cycle"

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

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

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

По сути, я удалил код, который 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];                
                }            
            }
10
задан outis 19 July 2012 в 02:16
поделиться