Я совсем новичок в программировании и 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];
}
}