2012-04-23 10 views
2

私はNSURLを作成してセレクタに渡し、それを別のセレクタなどに渡します。この時点で、どこに行くのかは問題なくログに記録されますが、使用時にはシガボットを与えます。私は、私のオブジェクトがARCによって解放されたということを意味します。私はそれが使用されるのに十分長く留まっていることをどうやって確認できますか?ios ARC force retain 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

2

まず、実際にゾンビを有効にして実行する参照カウントの問題を処理していることを確認する必要があります。

すべてのURLが渡されているかどうかはわかりませんが、ARCが有効な場合は明示的な参照カウントが必要なコーナーケースがあります。

MRCセマンティクスが必要な場合は、CFRetainを使用してCFReleaseと一致させるか、またはARCを有効にしてコンパイルされていない独自の関数を作成できます。

もちろん、代わりに(この場合は)CFTypesを使用できます。

+0

"CF"タイプは手動で保持/解放する必要がありますか? – Jacksonkr

+1

@ジャックソン彼らは – justin

+0

ちょうどドキュメントを読んで終わった。情報をありがとう - 私は今までCFTypesについて知りませんでした。 – Jacksonkr

関連する問題