0

アプリで使いたいエアコン機能を見つけました。残念ながら、私のcの知識は素晴らしいものではありません。コードの最初のセクションは元のcコードを示し、2番目のセクションはObjectivecへの私の「翻訳」を示しています。私は3つの質問があります私は助けていただければ幸いです:

  1. cの対応する変数からObjectiveCの対応する変数への変数の変換は有効ですか?(コンパイラの警告はありません)
  2. 最後にfree()を使用することは許容されますか、それともObjectivecで別の方法で使用する必要がありますか

cコード:

unsigned int i, j, diagonal, cost, s1len, s2len;
unsigned int *arr;

char *str1, *str2;

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (unsigned int *) malloc(sizeof(unsigned int) * j);

general code...

free(arr);

Objective Cコード:

NSUInteger i, j, diagonal, cost, s1len, s2len;
NSUInteger *arr;

const char *str1 = [source cStringUsingEncoding:NSISOLatin1StringEncoding];
const char *str2 = [target cStringUsingEncoding:NSISOLatin1StringEncoding];

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (NSUInteger *) malloc(sizeof(NSUInteger) * j);

general code...

free(arr);
4

4 に答える 4

6

Objective-CはCの厳密なスーパーセットであるため、変更を加えずに任意のCコードを使用できます。Cコードを(可能な限り)そのまま使用するか、Objective-Cのオブジェクトを使用してアルゴリズムを再実装することをお勧めします。

NSStringからchar

提供する必要があるのは、Objective-CオブジェクトをNSString*からchar*などのC型に変換する方法です。

変換は正しいですが、-UTF8Stringすべての文字をそのまま維持するために使用することをお勧めします。Latin-1は一部の情報を失う可能性があります。utf-8の欠点は、Cコードが正しく動作しない可能性があることです。

strlenの代わりにNSStringのメソッドの1つを使用して長さを取得することをお勧めします。これは、実行時間が線形であり、NSStringのメソッドが一定である可能性があるためです。

// utf-8
int len = [source length];
// latin 1
int len = [source lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];

NSIntegerへのint

intをNSIntegerに変換する理由はありません。Appleは、64ビット互換性のためにこのタイプを追加しました。NSIntegerはtypedefされているため、32ビットプラットフォームでは32ビットが必要であり、64ビットプラットフォームでは64ビットが必要です。

私はCコードをできるだけ変更しないようにします。(オリジナルが更新されたときに更新しやすくなります。)したがって、intはそのままにしておきます。

メモリ管理

Cのメモリ管理はObjective-Cよりも基本的ですが、mallocとfreeを使用していることをご存知のように、それは同じままです。保持/解放とガベージコレクターは、とにかくオブジェクトに対してのみ役立ちます。

于 2010-02-23T09:29:55.750 に答える
3

iPhone向けに開発する場合、ObjectiveCとPureCを組み合わせることができます。一般に、Objectvie Cでは、より高いレベルのオブジェクトを操作する必要があるため、mallocなどを呼び出す必要はありません(もちろん可能ですが)。

Cコードが提供する機能をObjectiveCで最初から再実装することをお勧めします。つまり、Cコードの行を変更するのではなく、コードに何を要求するかを考えてから、ObjectiveCコードを記述するだけです。行ごと。または、プロジェクトに純粋なCコードを含めて、ObjectiveCから必要な関数を呼び出します。

于 2010-02-23T09:02:38.713 に答える
1

コードでc関数をそのまま使用することを妨げているのは何ですか?Objective-cでは任意のc関数を使用でき、問題は発生しません。Cocoaの関数の多くはc関数です(たとえば、NSSearchPathForDirectoriesInDomains()

于 2010-02-23T09:03:12.713 に答える
1

お使いのCバージョンは完全に有効なObjective-Cコードです。あなたはそれを翻訳する必要はありません。

于 2010-02-23T09:46:31.433 に答える