39

char *で見せたいUITextField

私が試したこと:

char *data;
char *name=data+6;
txtName.text=[[NSString alloc] initWithCString:name encoding:NSUTF8StringEncoding];

しかし、私は正しい値を取得していません。

4

3 に答える 3

75

NSStringからを作成するにはconst char *、次のメソッドを使用します。

autoreleased オブジェクトを返します:

/**
 * Should be wrapped in `@autoreleasepool {...}`,
 * somewhere not far in call-stack
 * (as closer it's, the lower our memory usage).
 */
NSString *stringFromChar(const char *input) {
    return [NSString stringWithUTF8String: input];
}

returnオブジェクト (おそらく) になるたびに、Swift最も近いブロックに登録する必要があります ( owner -rulesに従って、メモリ リークを防ぐために method を@autoreleasepool呼び出すことによって) が、自動的に登録されます。autoreleaseARC

ただし、無効にしても、次のように手動でARC呼び出す必要はありません。autorelease

return [[NSString stringWithUTF8String: name] autorelease];

通常、便利なファクトリ メソッド ( などstringWithUTF8String:) は、メソッドを既に呼び出していますautorelease(または、ARC無効になっている場合は呼び出す必要があります)。これは、クラスが単にインスタンスを所有することを意図していないためです。

retained オブジェクトを作成します。

NSString *result = [[NSString alloc] initWithUTF8String: name];

// ... Do something with resulted object.

// NOTE: calling below is not required
// (If ARC enabled, and should cause compile error).
[result release];

違いについて2021年を更新します。ARC有効にすると、これら 2 つのメソッドは同等になります (つまり、メソッドをARC自動呼び出しautoreleaseします。常に Nearest に登録します@autoreleasepool)。

参照

正しい値が得られない場合は、データに問題があります。いくつかの呼び出しを追加しNSLogて、文字列の内容を確認します。

于 2012-05-29T10:31:33.303 に答える
9

あなたは何を期待していますか?初期化されていない char* があります。次に、ポインターに 6 を追加しますが、これは既に未定義の動作です。次に、古いゴミを指しているポインターを NSString* に変えようとします (そして、それがどこを指しているのかわかりません)。これから良いことは何も生まれません。

ASCII または UTF-8 エンコーディングを使用して、実際の実際の C 文字列を指す char* を定義します。次に、次のように NSString を作成します。

char* cstring = "Try harder";
NSString* objcstring = @(cstring);
于 2016-09-02T08:29:47.520 に答える
6

使用できます[NSString stringWithUTF8String: data]

于 2012-05-29T10:32:32.270 に答える