2012-04-23 84 views
2

我正在制作一个NSURL并将它传递给选择器,然后将其传递给另一个选择器等等。当它到达它的位置时,它会记录下来,但它使用sigabort时使用它。我怀疑这意味着我的对象已被ARC发布。我怎样才能确保它保持足够长的时间来使用?ios ARC力保留NSURL

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

这是我能想到的“最强”的事情,但仍然无效。有什么建议?

回答

5

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

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

简短的版本是,确保东西拥有url,你可以使它成为你的类的一个属性,一个实例变量,甚至静态,如果你一次只能使用你的类的一个实例。

+0

这个回应是一个重要的节省时间。谢谢! – GnarlyDog 2012-11-05 19:01:07

2

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

我不知道所有的URL都通过了哪些URL,但是在启用ARC时需要明确的引用计数。

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

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

+0

是否需要手动保留/释放“CF”类型? – Jacksonkr 2012-04-23 02:30:48

+1

@杰克逊他们做 – justin 2012-04-23 02:41:49

+0

刚读完文档。感谢您的信息 - 我从来不知道有关CFType的信息。 – Jacksonkr 2012-04-23 02:52:09