2012-04-23 93 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