我正在制作一个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];
...
这是我能想到的“最强”的东西,但仍然无效。有什么建议吗?
答案 0 :(得分:5)
当url对象在fetchVideoContent方法结束时,你需要确保初始url变量(__strong NSURL * url)继续存在,否则,你将得到你正在描述的错误。听起来像你在方法中创建url对象,使用局部变量,然后通过几个方法传递该对象,这些方法要么交叉到新线程,要么转到runloop的末尾并返回到下一次运行。
例如,如果通过您省略的步骤,当前运行循环结束,并且初始url变量超出范围,则将释放url对象,因为实际上没有任何东西实际上保留它。将对象传递给另一个方法是不够的,因为不会在参数上调用retain。
短版本是,确保某些内容保存在网址上,如果您一次只使用一个类的实例,则可以将其设置为类的属性,实例变量甚至是静态。
答案 1 :(得分:2)
首先,您应该验证您实际上是在处理引用计数问题 - 在启用僵尸的情况下运行。
我不知道所有网址的传递方式,但有些情况下,启用ARC时需要进行显式引用计数。
如果需要MRC语义,您可以使用CFRetain
并将其与CFRelease
匹配,或者您可以创建自己的函数,这些函数在未启用ARC的情况下编译。
当然,你可以简单地使用CFTypes(在这种情况下)。