首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__weak SLComposeViewController导致IOS 8崩溃

__weak SLComposeViewController导致IOS 8崩溃
EN

Stack Overflow用户
提问于 2015-01-07 23:29:14
回答 1查看 756关注 0票数 1

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

viewController呈现视图控制器:facebookSLController动画:是,完成:零;

我的facebookSLController是零。这是因为__weak。但是为什么它没有在IOS 7中崩溃呢?我该如何解决这个问题呢?下面是代码的一部分:

代码语言:javascript
复制
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];

}
EN

回答 1

Stack Overflow用户

发布于 2015-01-08 00:34:50

问题是,您在处理内存管理时不知道自己在做什么。你的代码毫无意义。声明变量weak并将新创建的实例赋值给该变量意味着该实例将立即消失-因为没有任何东西可以保留它。通常,变量的强引用将保留它,但是通过声明变量weak,您已经阻止了这一点。因此,您可能期望controller在您声明的那一刻就会消失在喷烟中--这就是它正在做的事情。这段代码在iOS 7或iOS 8中从未正确工作。

如果您想通过弱引用将通过controller引用的视图控制器传递到块中,那么就这样做;对controller进行另一个引用,弱引用,并让它传递到块中(并对它执行“弱-强舞蹈”,以便您的块正确运行)。但是controller本身需要一个正常的引用。因此(未经测试直接输入的警告,注意打字):

代码语言:javascript
复制
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
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27830559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档