2

私はを作成しNSURLてセレクターに渡し、セレクターは別のセレクターなどに渡します。目的の場所に到達するまでには、ログは正常に記録されますが、使用するとシガボルトが発生します。これは、私のオブジェクトが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に保持されていることを確認してください。一度に使用するクラスのインスタンスが1つだけの場合は、それをクラスのプロパティ、インスタンス変数、または静的にすることができます。

于 2012-04-23T02:15:32.497 に答える
2

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

すべての URL が何を通過しているのかはわかりませんが、ARC が有効になっているときに明示的な参照カウントが必要になるまれなケースがあります。

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

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

于 2012-04-23T01:32:57.590 に答える