1

私は Objective-C を学んでおり、Vector3D クラスを作成しようとしています。

C++ または Java では、実装したい関数は次のようになります。

Vector3D
{
  Vector3D crossProduct(Vector3D in)
  {
    Vector3D result;
    result = ...  // maths involving this classes variables and the input Vectors variables.
    return result; 
  }
}

現在、objective-c ではオブジェクトを返すことはできず、オブジェクト ポインターのみを返すことができます。これは autorelease を使用する適切な場所でしょうか (戻る前に?)。これにより、Vector3D クラスのメソッドを連鎖させることができます (多くのメソッドがオブジェクト自体を返すため) が、オブジェクトを手動で割り当てて解放するのに比べて、これは特に非効率的でしょうか? Objective-C でオブジェクトを返すために使用される他の一般的なパターンはありますか?

クラスでやりたい操作の例:

Vector3D * vector3D1 = [[Vector3D alloc] init];
Vector3D * vector3D2 = [[Vector3D alloc] init];
Vector3D * vector3D3 = [vector3D1 cross [ [vector3D2 normalize ] multiply 1.43f]];

ありがとう。

4

2 に答える 2

1

はい、これはまさに適切な使用法であり、実際、コードを使用するほとんどの人は、 、、および自動解放されたオブジェクトを返すautoreleaseことを完全に期待しています。crossnormalizemultiply

于 2010-09-25T19:27:08.540 に答える
1

オブジェクトを作成すると、それを「所有」します。所有権を放棄または譲渡したい場合は、オブジェクトを自動解放または解放する必要があります。オブジェクトを解放してから返すことはできないため、自動解放する必要があります。これは「適切な使用」よりもやや強いことに注意してください。

これを行わないと、静的アナライザーから警告が表示されます。有効になっていることを確認してください。

私からメモリ管理のルールを学ぶのではなく、アップルからメモリ管理のルールを学ぶべきです。http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

Cocoa には 2d Point クラスがありません。代わりに、非効率性のために、代わりに C 構造体 (NSPoint または CGPoint) を頻繁に使用します。部分的には Apple の例のせいで、部分的には非効率性への恐れから、3dVector クラスはめったに見られません。より一般的には、代わりに 4 つの float を持つ C 構造体が表示されます。これは、OpenGL または OpenCL の方が便利だからかもしれません。

簡単に言えば、「objective-cではオブジェクトを返すことができず、オブジェクトポインターのみを返す」と言います。これは Java や C++ の場合とまったく同じであり、objective-c で別のことを行う理由にはなりません。

于 2010-09-25T20:49:59.200 に答える