11

autoreleaseiOSでは注意が必要だと思います。呼び出し元が必要とするオブジェクトを返すメソッドがあるallocので、この状況では、私が理解しているようautoreleaseに、オブジェクトが戻る前に、呼び出し先のオブジェクトに送信する必要があります。

これは問題ありませんが、コントロールが電話に戻ると(つまり、ボタンのクリックが処理された後)、自動解放プールが解放されたように見えます。これが想定されていることだと思いますが、この状況のベストプラクティスは何でしょうか。

オブジェクトが解放されないように呼び出し元からメッセージを送信してretainから、で明示的に解放することにしましたdealloc

これが最善のアプローチですか?

4

5 に答える 5

21

自動解放プールは通常、実行ループの各反復後に解放されます。大まかに言って、すべてのCocoaおよびCocoaTouchアプリケーションは次のように構成されています。

Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool

あなたが説明するのは、期待される振る舞いです。それより長くオブジェクトを保持したい場合は、明示的に保持する必要があります。

于 2009-03-23T14:02:41.177 に答える
13

を使用autoreleaseすると、「オブジェクト、私はもうあなたを必要としませんが、あなたを必要とする可能性のある他の誰かにあなたを渡すつもりです。だからまだ消えないでください.」という言い方です. したがって、オブジェクトは、メソッドから返すか、別のオブジェクトに渡すのに十分な時間残ります。retain一部のコードでオブジェクトを保持したい場合は、それをing して所有権を主張する必要があります。

正しく使用するために知っておく必要があるすべてのことについては、メモリ管理のガイドラインを参照してください。autorelease

于 2009-03-23T21:20:06.757 に答える
3

Apple メモリ管理ドキュメントに記載されている例を次に示します。

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
        /* Do a search that creates a lot of temporary objects. */ 
        match = [self expensiveSearchForObject:anObject]; 
        if (match != nil) { 
            [match retain]; /* Keep match around. */ 
        } 
        [subPool release]; 
    } 
    return [match autorelease];   /* Let match go and return it. */ 
}
于 2009-03-23T21:21:33.350 に答える
2

はい、それが最善の方法です。自動解放は、実際には、既知のコード内での対話のみを目的としています。オブジェクトを保存したら、参照を保持しているオブジェクトは、オブジェクトの処理が完了するまで消滅/範囲外にならないことを知っておく必要があります。または、オブジェクトを保持する必要があります。

于 2009-03-23T13:43:49.707 に答える
1

自動解放されたオブジェクトがメソッドの終了後に解放されることが保証されているだけです。結局のところ、メソッドを呼び出したメソッドが独自のプールを作成し、メソッドの直後にそれを解放する可能性があります。

于 2009-03-23T21:06:03.200 に答える