こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

NSUserDefaultsに構造体を保存する方法

NSUserDefaultsに構造体を保存する方法をお教えください。
下記のコードで一度実行したあと停止し、行コメントを解除しブロックコメントを有効にして再び実行すると整数のint型は出力できましたが、文字列のchar型は出力できませんでした。文字列をuserDefaultに保存し出力する方法をお教えください。
-(void)viewDidLoad{
typedef struct{
int id;
char *names;
}member;
NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
// /*
//構造体をバイト列としてデータ型に変換してユーザデフォルトに保存する
member memberStruct;
memberStruct.id = 2;
memberStruct.names = "あいうえお";
NSData *data = [NSData dataWithBytes:&memberStruct length:sizeof(member)];
[userdefaults setObject:data forKey:@"strct"];
[userdefaults synchronize];
// */
//取り出し
NSData *data2 = [[NSData alloc]init];
data2 = [userdefaults objectForKey:@"strct"];
member memberStruct2;
memberStruct2 = *(member *)data2.bytes;
int i = memberStruct2.id;
char *names2 = memberStruct2.names;
NSString *string = [NSString stringWithCString:names2 encoding:NSUTF8StringEncoding];
NSLog(@"i = %i",i);
NSLog(@"names2 = %@",string);
}

投稿日時 - 2013-10-13 01:53:38

QNo.8303349

すぐに回答ほしいです

質問者が選んだベストアンサー

> 文字列のchar型は出力できませんでした。

C言語のポインタでつまづいているの図、です。
文字列の型はcharではなく、char *型です。つまりポインタですから、そのままでは文字列本体でなく、アドレスのみNSUserDefaultsに保存されることになるでしょう。
NSValueクラスに、ポインタ参照のオブジェクトをラップするメソッドがあったように記憶しています。が、文字列はNSStringクラスのインスタンスにして、NSUserDefaultsに保存するのが、まあふつうの処理だと思います。

NSUserDefaults Class Referenceより:

stringForKey:
Returns the string associated with the specified key.

- (NSString *)stringForKey:(NSString *)defaultName
Parameters
defaultName
A key in the current user's defaults database.
Return Value
For string values, the string associated with the specified key. For number values, the string value of the number. Returns nil if the default does not exist or is not a string or number value.

投稿日時 - 2013-10-13 18:47:54

お礼

>アドレスのみNSUserDefaultsに保存されることになるでしょう
なるほど、道理でブロックコメントをコメントアウトしている時はアドレスを参照していたため正常に出力できていたんですね。
ありがとうございました。

投稿日時 - 2013-10-14 00:07:25

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-