1

cStringUsingEncoding:動的に割り当てられたC文字列(ドキュメントから)を返しているにもかかわらず、「constchar*」を返します。それで、ここでのconstの目的は何ですか?char *にキャストすることで、返されたC文字列を簡単に変更できます。

cStringUsingEncoding:

返されるC文字列は、レシーバーが解放されるか、現在の自動解放プールが空になるまでのいずれか早い方までのみ有効であることが保証されます。

ライブラリは、ポインタから定数への一般的な慣習に従っていると思います。変更またはリリースされる予定はありません。

Objective-Cランタイムから。

const char * object_getClassName(id obj)-返された文字列について何も指定されていません。

char * method_copyArgumentType(Method method、unsigned int index)-free()を使用して文字列を解放する必要があります。(コピーが返されるため、アドバイスしている可能性があります。)

4

2 に答える 2

4

一般的なパターンは、所有していないバッファを変更しないことです。constドキュメントと(ある程度)これを強制します。

についてcStringUsingEncoding:は、ドキュメントには、返されたバッファは、それを受け取ったNSStringの間、または現在の自動解放プールの期間中のみ有効であると記載されています。これは、返されたバッファを解放することを期待されていないため、所有していないことを意味します。

ランタイムの最後の2つの例は、同じ規則に従います。

  • const char * object_getClassName(id obj)

    バッファを解放する必要があることを通知しません。また、名前には、バッファを所有していることを示すものは含まれていません。したがって、あなたはそれをしませんfree()、そしてあなたはそれを修正しません。

  • char * method_copyArgumentType(Method method, unsigned int index)

    ドキュメントには、バッファを解放する必要があることが明示的に示されています。関数名にはcopy、バッファを所有していることを示すテルテールが含まれています。したがって、あなたはそれをあなたが望むすべてに修正することができ、そしてそれをしなければなりませんfree()

于 2012-08-30T17:42:47.743 に答える
2

つまり、結果はconstです。

  • それを変更しても文字列自体は変更されません。cStringは実際には文字列の異なる表現を意味します。
  • 文字列が変更されない限り、おそらく同じcStringを「何度も何度も」返します。

それ以外は、実装が強制しない場合や必要としない場合でも、結果をconstとして宣言することは、インターフェイスデザイナーが実行できることです。おそらく、そのように扱われることを望んでいるためです。また、「const」が役立つ場合に備えて最適化するためのパスを開いたままにします。

于 2012-08-30T17:42:25.090 に答える