2

我正在制作一个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];
    ...

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

4

2 回答 2

5

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

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

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

于 2012-04-23T02:15:32.497 回答
2

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

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

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

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

于 2012-04-23T01:32:57.590 回答