【问题标题】:ios ARC force retain NSURLios ARC强制保留NSURL
【发布时间】:2012-04-23 01:11:21
【问题描述】:

我正在制作一个NSURL 并将其传递给一个选择器,然后将其传递给另一个选择器,等等。当它到达它要去的地方时,它记录得很好,但是在使用它时会给出一个 sigabort。我怀疑这意味着我的对象已被 ARC 释放。我怎样才能确保它的使用时间足够长?

__strong NSURL *url = [[NSURL alloc] initWithString:str];

... passes to a selector
... passes to another
... and then to fetchVideoContent

- (void)fetchVideoContent:(NSURL *)url withGUID:(NSString *)guid;
{
    NSMutableURLRequest *req;
    req = [NSMutableURLRequest requestWithURL:url // <-- DIES ON THIS LINE (SIGABRT)
                                  cachePolicy:NSURLRequestUseProtocolCachePolicy
                              timeoutInterval:30.0];
    ...

这是我能想到的“最强”的东西,但仍然行不通。有什么建议吗?

【问题讨论】:

    标签: ios automatic-ref-counting nsurl


    【解决方案1】:

    当 url 对象以 fetchVideoContent 方法结束时,您需要确保初始 url 变量 (__strong NSURL *url) 继续存在,否则,您将收到您所描述的错误。在我看来,您正在使用局部变量在方法中创建 url 对象,然后将该对象通过几个方法传递,这些方法要么交叉到新线程,要么进入运行循环的末尾并返回下次运行。

    例如,如果通过您省略的步骤,当前运行循环结束,并且初始 url 变量超出范围,则 url 对象将被释放,因为实际上没有任何东西在保留它。将对象传递给另一个方法不足以保留它,因为不会在参数上调用保留。

    简短的版本是,确保某些东西保留在 url 上,如果您一次只使用一个类的实例,您可以将其设为类的属性、实例变量甚至是静态的。

    【讨论】:

    • 此响应大大节省了时间。谢谢!
    【解决方案2】:

    首先,您应该验证您实际上正在处理引用计数问题——在启用僵尸的情况下运行。

    我不知道要传递的所有 URL 是什么,但在某些极端情况下,启用 ARC 时需要显式引用计数。

    如果需要 MRC 语义,您可以使用 CFRetain 并将其与 CFRelease 匹配,或者您可以创建自己的未启用 ARC 编译的函数。

    当然,您可以简单地使用 CFTypes 代替(在这种情况下)。

    【讨论】:

    • 刚刚阅读完文档。感谢您提供的信息 - 直到现在我才知道 CFTypes。
    • @Jackson 啊——在这种情况下,知道NSURL 也可以被视为CFURLRef 也可能会有所帮助,前提是您使用正确的桥接转换。您可以安全地将 NSURL 作为 CFURL 传递,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2014-03-28
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多