2

シングルトン クラスの構造内で an の値NSStringを aに割り当てるのに問題があります。char *以下は私の問題を単純化したものです。私のコードは、構造体でより多くのフィールドを利用し、より多くNSStringの を渡します。

構造を持つシングルトンクラス「SingletonClass」があるとします(Appleドキュメントで宿題を行い、正しく実装しました):

struct sampleStruct {
    char *string1;
    //other fields
} struct1;

struct1.string1渡された NSStringの値を設定するこのメソッドを使用します。

- (void)initStructWithString:(NSString *)inputString {
     //warning: assignment discards qualifiers from pointer target type
     struct1.string1 = [inputString cStringUsingEncoding:NSUTF8StringEncoding];
}

そして、次を使用するこのメソッドstruct1.string1

- (void)useCharArray {
     //I would obviously be doing something more complex in reality
     printf("This is the char array: %s", struct1.string1);
     //doesn't print the value I assigned to it, but garbage
}

あるクラスから呼び出して別のクラスinitStructWithString:(NSString *)inputStringから呼び出そうとすると、ゴミの山です。デバッグ中に、各クラスが this の同じインスタンスを取得していることを確認しました。useCharArraystruct1.string1SingletonClass

私はまだObjective-CとCを学んでいるので、メモリ管理に問題がある可能性があることを認識しています。a ではなく a[NSString cStringUsingEncoding]に割り当てる必要があることはわかっていますが、構造内のフィールドが a であるため、他にどのように対処すればよいかわかりません。新しい結果を割り当ててからコピーするなど、他のアプローチを試しました。そのアプローチは同じ結果をもたらしました。const char *char *char *initSructWithStringconst char *[NSString cStringUsingEncoding]strlcpystruct1.string1

NSStringanの値を構造体内に格納するための正しい手法は何ですか?また、char *この構造体内のフィールドがSingletonClass異なるクラスで使用されているため、値を確実に保持するにはどうすればよいですか?

4

3 に答える 3

4

注目すべきことの 1 つは、正しいメソッド名がcStringUsingEncoding:;であることです。この文字列はほぼ同時に消えるinputStringため、結果の文字列をコピーする必要があります。

UTF8String代わりに (同じことを行う便利なメソッド)の使用を検討することも価値があるかもしれません。

于 2009-07-14T16:22:48.367 に答える
1

Can't comment yet so writing here (after upping the above Answer)... Just came accross this (I realise it's a few years later) and figured an example might help others to some extent:

I'm using this to get the player's name from game center on iOS, I'll have issues with funky characters etc. but my font doesn't support them anyway. ppName is obviously a pointer to a pointer to a char, passed to the method I have this code in.

*ppName = (char *)malloc(strlen([pPlayer.alias UTF8String]));
strcpy(*ppName, [pPlayer.alias UTF8String]);
于 2011-04-03T07:09:25.100 に答える