Objective-CでNSMutableArrayを保存したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
山田

Objective-CでNSMutableArrayを保存したい

#1

投稿記事 by 山田 » 7年前

Objective-CでNSMutableArrayをNSUserDefaultsで保存したいです。
NSDataに変換して保存したり、読み込みをするようにしたいのですが、
何も保存されていない場所を読み込むとNULLが返ってきてしまいます。

読み込んだ配列に重複分を削除して、追加するみたいな処理を書いているのですが、
NULLが返ってきてしまうと、追加出来なくなってしまいます。

ソースの書き方が悪いのはわかっているのですが、回避法などアドバイス頂けないでしょうか。

参考サイト
http://qiita.com/tomokr/items/3ba8fe9997e3fb52a16f

コード:


	NSMutableArray *readArray = [[NSMutableArray alloc] init];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:PATH_HISTORY];
    
    NSLog( @"%@ %d", readArray, (int)readArray.count );
    readArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];     
    NSLog( @"%@ %d", readArray, (int)readArray.count );
    
    // 履歴の保存
    NSString *str = [[index objectAtIndex:indexPath.row] objectAtIndex:CSV_ID];
    [readArray removeObject:str];
    [readArray insertObject:str atIndex:0];
    if( [readArray count] >= HISTORY_MAX ){
        [readArray removeObjectsInRange:NSMakeRange( HISTORY_MAX, [readArray count]-HISTORY_MAX )];
    }
    
    NSLog( @"%@ %d", readArray, (int)readArray.count );
    
    data = [NSKeyedArchiver archivedDataWithRootObject:readArray];
    [defaults setObject:data forKey:PATH_HISTORY];
    [defaults synchronize];
	

metaphor

Re: Objective-CでNSMutableArrayを保存したい

#2

投稿記事 by metaphor » 7年前

下記をみるとVS2015でもObjective-Cがコンパイル可能になったようです。iOSのプログラムですか?
https://www.microsoft.com/ja-jp/dev/cam ... tform.aspx
http://www.publickey1.jp/blog/15/visual ... ive-c.html
>何も保存されていない場所を読み込むとNULLが返ってきてしまいます。
これを回避する方法がhttp://iphone-tora.sakura.ne.jp/nsmutablearray.htmlにありませんか。

山田

Re: Objective-CでNSMutableArrayを保存したい

#3

投稿記事 by 山田 » 7年前

ご回答ありがとうございます!
iOSを目標でxcodeにて開発しております。

参考サイトですと配列についてですので、
今回のものとは関係ない気がいたします。

nsdataを展開しなければ問題ないのですが、中身が空のものを代入してしまうとNULLになってしまいます。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: Objective-CでNSMutableArrayを保存したい

#4

投稿記事 by あんどーなつ » 7年前

配列をSetに変換して、配列に戻すやり方はどうでしょうか?

http://captainshadow.hatenablog.com/ent ... 1299000298
オフトピック
iOSのアプリを作成したいのであればObjective-Cよりもswiftのほうがいいのではないかと思います。
Objective-Cは私は怖くて手を出せないです。

http://dixq.net/forum/viewtopic.php?f=3&t=16494

metaphor

Re: Objective-CでNSMutableArrayを保存したい

#5

投稿記事 by metaphor » 7年前

ここはhttp://iphone-tora.sakura.ne.jp/nsuserdefaults.htmlはどうでしょう。
Objective-Cはよく分からないので行毎にコメントを入れて頂くと有難いです。

コード:

NSMutableArray *readArray = [[NSMutableArray alloc] init]; //何を目的とした配列であり、ここで初期化してます...とかです

metaphor

Re: Objective-CでNSMutableArrayを保存したい

#6

投稿記事 by metaphor » 7年前

VS2015でiOSとAndroidアプリが作れる環境は構築できたのですがObjective-Cは使えませんでした...。残念です、ごめん。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: Objective-CでNSMutableArrayを保存したい

#7

投稿記事 by あんどーなつ » 7年前

Apple Developerのサンプルコードの中にnil対策が書いてありました。

https://developer.apple.com/library/con ... lementID_4

サンプルでは、ハッシュがnilの時は@"Default"という文字列を書き込んでいるみたいですね(まあ、当たり前です)。

質問では、NSMutableArrayを保存するということですので、[[NSMutableArray alloc] init]を書き込んでおけばよいかと思います。
オフトピック
ここの住人はWindowsユーザーが多いので、(Objective-Cの質問でもSwiftの質問でも)AppleのForumなど別の場所を探したほうがよろしいかと思います。

metaphor

Re: Objective-CでNSMutableArrayを保存したい

#8

投稿記事 by metaphor » 7年前

調べてもコンパイルができないのでobjective-cの正式ForumかAppleのxcode/objective-cフォーラムがいいでしょう。
http://www.classroomm.com/objective-c/(objective-cの正式Forum)
https://forums.developer.apple.com/comm ... bjective-c(Appleのxcode/objective-cフォーラム)

コード:

    //NS---はNeXTSTEPの略(名前空間を持たないため、シンボルは衝突しないようにプレフィックスを付ける
    NSMutableArray *readArray = [[NSMutableArray alloc] init]; //NS可変長文字(配)列 alloc] init];
 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];//ユーザーデフォルト
    NSData *data = [defaults objectForKey:PATH_HISTORY]; //NSDataはバイト列のデータ(バイナリデータ)
                                                         //を扱う: シリアル化
    NSLog( @"%@ %d", readArray, (int)readArray.count );  //NSLogはコンソールにログを出力します。
    readArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];//アーカイブした結果のNSDataから。
                              //元のデータを復元 :アンアーカイブのための NSKeyedUnarchiver クラス。
    NSLog( @"%@ %d", readArray, (int)readArray.count ); //コンソールにログを出力
    
    // 履歴の保存
    NSString *str = [[index objectAtIndex:indexPath.row] objectAtIndex:CSV_ID];
    [readArray removeObject:str];
    [readArray insertObject:str atIndex:0];
    if( [readArray count] >= HISTORY_MAX ){
        [readArray removeObjectsInRange:NSMakeRange( HISTORY_MAX, [readArray count]-HISTORY_MAX )];
    }
    
    NSLog( @"%@ %d", readArray, (int)readArray.count );
    
    data = [NSKeyedArchiver archivedDataWithRootObject:readArray]; // インスタンスをシリアライズ
    [defaults setObject:data forKey:PATH_HISTORY];                 //  アーカイブ
    [defaults synchronize];
 

anonymous5

Re: Objective-CでNSMutableArrayを保存したい

#9

投稿記事 by anonymous5 » 7年前

山田 さんが書きました:何も保存されていない場所を読み込むとNULLが返ってきてしまいます。
読み込んだ配列に重複分を削除して、追加するみたいな処理を書いているのですが、
NULLが返ってきてしまうと、追加出来なくなってしまいます。
何の実行結果がNULLなのかとか何に中身が空のものを何に代入したのか、状況がよくわかりませんが、保存したNSUserDefaultsから読み込んだらNSDataが nilだった、ということでしょうか。

nilなら readArrayにNSMutableArrayを新規に作成したインスタンスを入れて、必要な追加処理をすればいいのでないでしょうか。

コード:

	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
	NSData *data = [defaults objectForKey:PATH_HISTORY];
	
	NSMutableArray *readArray;
	if(data)
	{
		@try
		{
			readArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
		}
		@catch (NSException *exception)
		{}
	}
	
	if(readArray == nil)
		readArray = @[].mutableCopy;
	
	NSString *str = index[indexPath.row][CSV_ID];
	[readArray removeObject:str];
	[readArray insertObject:str atIndex:0];
	if( [readArray count] > HISTORY_MAX )
		[readArray removeObjectsInRange:NSMakeRange( HISTORY_MAX, [readArray count]-HISTORY_MAX )];
	
	data = [NSKeyedArchiver archivedDataWithRootObject:readArray];
	[defaults setObject:data forKey:PATH_HISTORY];
	[defaults synchronize];

山田

Re: Objective-CでNSMutableArrayを保存したい

#10

投稿記事 by 山田 » 7年前

お礼が遅くなってしまい申し訳ございません。
Swiftを使うべきなのですが、Objective-Cの関数をようやく覚えてきたのでこちらで実装しております。

if( str == nil ) みたいな形だとif文通らなくて困っておりました。

そもそも、そのパスがあるかでチェックすることで回避することができました。
http://stackoverflow.com/questions/1692 ... ta-is-null

あんどーなつ 様から頂きましたURLで、発想が見えてきて本当に助かりました!

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: Objective-CでNSMutableArrayを保存したい

#11

投稿記事 by あんどーなつ » 7年前

オフトピック
山田 さん

自分はMac持ってないので間違ってたらどうしようとか思ってました。
GoogleグループやApple公式フォーラムでも日本語の投稿があまりないみたいですね。

この掲示板にも少ないですがObjective-Cができる人が(anonymous5 さん以外にも)いらっしゃるみたいなので
次に分からないことがあったらまた投稿してみてください。
ただ私の方では回答しないつもりなので1週間くらいかかるかもしれませんが、より分かりやすい回答が返ってくると
思います。

閉鎖

“C言語何でも質問掲示板” へ戻る