Jestem bardzo nowy w programowaniu i Objective-C i próbuję ustalić, co jest nie tak z mój kod. Czytałem trochę o blokach, ale nie wiem, czy jakikolwiek z tego, co przeczytałem do tej pory, dotyczy mojego kodu.iOS 5 Twitter Framework i completeHandler block - "Samo przechwytywanie" w tym bloku prawdopodobnie doprowadzi do zatrzymania cyklu "
Mój kod jest oparty na systemie iOS 5 Twitter Framework. Używam większości przykładowego kodu dostarczonego przez firmę Apple, więc na początku nie miałem pojęcia, że korzystam z bloku do obsługi zakończenia.
Teraz mam te dwa komunikaty z Xcode 4 powiedzenie „1. Blok zostaną zachowane przez obiekt silnie zatrzymywane przez przechwyconego obiektu” i "przechwytywanie«ja»zdecydowanie tego bloku może prowadzić do zatrzymaj cykl ".
Zasadniczo, co zrobiłem jest usunięcie Apple kodu używanego w ich obsługi ukończenia (switch z TWTweetComposeViewControllerResultCancelled & TWTweetComposeViewControllerResultDone) i wykorzystywane mój, jeśli sprawozdania z [imagePickerController sourceType]
.
Tak więc sendTweet
zostaje wywołane po dodaniu obrazu do tweeta.
Mam nadzieję, że ktoś może mi wyjaśnić, dlaczego tak się dzieje i jak mogę to rozwiązać. Ponadto: czy mogę umieścić kod obsługi zakończenia w metodzie zamiast bloku?
- (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];
}
}
Dzięki za pomoc! Ponieważ jestem początkującym początkującym, miałem problem z ustaleniem, jak naprawdę to zaimplementować. W końcu użyłem __weak UIImagePickerController * weakSelf = imagePickerController; i zmień moje instrukcje if na if ([weakSelf sourceType]). Xcode 4 nie pokazuje już żadnych błędów, więc przypuszczam, że postąpiłem słusznie. (?) – iMaddin
+1 @Dennis dzięki za odpowiedź. Proszę również wyjaśnić, kiedy używane jest "__block". Przykład Mam składnię taką jak składnia: __block HomeViewController * weakSelf = self; – HDdeveloper