1

我在 IOS 8 中遇到了 SLComposeViewController 的问题。我想显示 Facebook 共享窗口,完成后 - 显示 Twitter 共享窗口。这就是为什么我需要使用完成块并避免保留周期我必须使用__weak SLComposeViewController,但是当我调用

[viewController presentViewController:facebookSLController 动画:YES 完成:Nil];

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];

}
4

1 回答 1

2

问题是您在不知道自己在做什么的情况下搞乱了内存管理。你的代码没有意义。声明一个变量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
    }
}
于 2015-01-08T00:34:50.613 回答