2

CGPointMakeの説明が必要ですか?を参照してください。

私が間違っている場合は、の実装でCGPointMakeCGPoint p;のローカル変数を宣言しstructてください。スコープを離れた後に解放する必要があります。しかし、なぜ関数はリスクなしで値を返すことができるのでしょうか?

とにかく、の実装CGPointMakeが正しいと仮定して、によって作成されたCGPointを解放する必要がありますCGPointMakeか?

4

2 に答える 2

7

ヒープ上に存在することはなかったため、解放する必要はありません。ヒープに割り当てられたメモリのみを解放する必要があります。スタックに割り当てられたメモリ(で行われているようにCGPointMake())は、メソッド/関数が存在した後に自動的にクリーンアップされます。

コンパイラが「ああ、この関数はsizeof(CGPoint)バイトサイズの構造体を返したいので、戻り値のメモリスロットにその大きなもののための十分なスペースがあることを確認します」と認識するため、関数はポイントを返すことができます。次に、関数が終了すると、戻り値がリターンメモリスロットにコピーされ、関数が終了し、リターンスロットの値が新しい宛先にコピーされます。

于 2010-09-17T01:57:45.103 に答える
0

CGPoint構造体は関数から直接返されるほど「十分に小さい」ため、関数はaを返すことができます。ポインタを返すのではなく、すべてを直接返します。パラメータとして受け取るメソッドと同じCGPointsです。すべてを値で直接渡すことができます。

Daveが指摘しているように、CGPointはオブジェクトではなく、単なる構造体です。CGPointMakeメモリを「割り当て」ません。これは、適切なサイズで設定された構造体を返す関数であり、通常、それを自分のスタックのローカルにキャプチャしたり、渡したりします。

他のプリミティブ型(int、float、または他の構造体)と同様に、スコープ外になったときに解放する必要はありません。

(注:多くのアーキテクチャ/コンパイラ/「アプリケーションバイナリインターフェイス」には、引数または戻り値として使用されるもののサイズに関する最適化とサイズ制限があります。この場合、CGPointは実際には1つの64ビットレジスタ内に完全に収まります( 2x 32ビットfloat)これにより、intを返すよりも重くなりません。ただし、コンパイラは、CGRectなどのより大きな構造をコピーインおよびコピーアウトする限り、他のトリックを実行することもできます。)

于 2010-09-17T02:04:26.880 に答える