Tôi rất mới để lập trình và Objective-C và tôi đang cố gắng để tìm ra những gì là sai với ma cua toi. Tôi đã đọc một chút về các khối nhưng tôi không biết làm thế nào bất kỳ những gì tôi đã đọc cho đến nay là có liên quan đến mã của tôi.iOS 5 Twitter Framework & completionHandler khối - "Chụp 'tự' mạnh mẽ trong khối này có khả năng dẫn đến một chu kỳ giữ lại"
Mã của tôi đang sử dụng Khung công tác Twitter 5 của iOS. Tôi sử dụng hầu hết các mẫu mã mà Apple cung cấp vì vậy tôi thực sự không có đầu mối lúc đầu mà tôi đã sử dụng một khối cho trình xử lý hoàn thành.
Bây giờ tôi nhận được hai tin nhắn từ Xcode 4 nói "1. Khối sẽ được giữ lại bởi một đối tượng giữ lại mạnh mẽ bởi các đối tượng bị bắt" và "chụp 'tự' mạnh mẽ trong khối này là khả năng dẫn đến một giữ lại chu kỳ ". Về cơ bản, những gì tôi đã làm là để loại bỏ mã Apple sử dụng trong xử lý hoàn thành của họ (chuyển đổi tuyên bố với TWTweetComposeViewControllerResultCancelled & TWTweetComposeViewControllerResultDone) và sử dụng các câu lệnh if của tôi với [imagePickerController sourceType]
.
Vì vậy, sendTweet
được gọi sau khi một hình ảnh đã được thêm vào tweet.
Tôi hy vọng ai đó có thể giải thích cho tôi lý do tại sao điều này xảy ra và cách tôi có thể giải quyết. Ngoài ra: tôi có thể đặt mã xử lý hoàn thành vào một phương thức thay vì một khối không?
- (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];
}
}
Cảm ơn sự giúp đỡ của bạn! Vì tôi là một người mới bắt đầu, tôi đã có vấn đề về cách thực hiện điều này. Cuối cùng tôi đã sử dụng __weak UIImagePickerController * weakSelf = imagePickerController; và thay đổi câu lệnh if của tôi thành if ([weakSelf sourceType]). Xcode 4 không hiển thị cho tôi bất kỳ lỗi nào nữa vì vậy tôi cho rằng tôi đã làm đúng. (?) – iMaddin
+1 @Dennis cảm ơn câu trả lời. Cũng vui lòng giải thích khi "__block" được sử dụng. Ví dụ tôi có cú pháp như __block HomeViewController * weakSelf = self; – HDdeveloper