我对IOS 8中的SLComposeViewController有问题,我想显示Facebook共享窗口,在它完成后显示Twitter共享窗口。这就是为什么我需要使用完成块和避免保留周期,我必须使用__weak SLComposeViewController,但是当我调用
viewController呈现视图控制器:facebookSLController动画:是,完成:零;
我的facebookSLController是零。这是因为__weak。但是为什么它没有在IOS 7中崩溃呢?我该如何解决这个问题呢?下面是代码的一部分:
if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
__weak SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[controller setInitialText:text];
//When facebook sharing end - we start twitter sharing
[controller setCompletionHandler:^(SLComposeViewControllerResult result) {
[controller dismissViewControllerAnimated:YES completion:nil];
[self shareTwitterImage:image withText:strGetApp fromViewController:viewController];
}];
[controller addImage:image];
[viewController presentViewController:controller animated:YES completion:Nil];
}发布于 2015-01-08 00:34:50
问题是,您在处理内存管理时不知道自己在做什么。你的代码毫无意义。声明变量weak并将新创建的实例赋值给该变量意味着该实例将立即消失-因为没有任何东西可以保留它。通常,变量的强引用将保留它,但是通过声明变量weak,您已经阻止了这一点。因此,您可能期望controller在您声明的那一刻就会消失在喷烟中--这就是它正在做的事情。这段代码在iOS 7或iOS 8中从未正确工作。
如果您想通过弱引用将通过controller引用的视图控制器传递到块中,那么就这样做;对controller进行另一个引用,弱引用,并让它传递到块中(并对它执行“弱-强舞蹈”,以便您的块正确运行)。但是controller本身需要一个正常的引用。因此(未经测试直接输入的警告,注意打字):
SLComposeViewController *controller =
[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[controller setInitialText:text];
// take a weak ref to pass into the block
__weak SLComposeViewController *weakController = controller;
[controller setCompletionHandler:^(SLComposeViewControllerResult result) {
// and now do the weak-strong dance with weakController...
// and do NOT refer to controller inside the block
SLComposeViewController *strongController = weakController;
if (strongController != nil) {
// ... your code here; refer only to strongController
}
}https://stackoverflow.com/questions/27830559
复制相似问题