ページ 1 / 1
Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月16日(金) 21:08
by 山田
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];
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月17日(土) 10:29
by metaphor
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月17日(土) 14:10
by 山田
ご回答ありがとうございます!
iOSを目標でxcodeにて開発しております。
参考サイトですと配列についてですので、
今回のものとは関係ない気がいたします。
nsdataを展開しなければ問題ないのですが、中身が空のものを代入してしまうとNULLになってしまいます。
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月17日(土) 15:21
by あんどーなつ
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月17日(土) 17:03
by metaphor
ここは
http://iphone-tora.sakura.ne.jp/nsuserdefaults.htmlはどうでしょう。
Objective-Cはよく分からないので行毎にコメントを入れて頂くと有難いです。
コード:
NSMutableArray *readArray = [[NSMutableArray alloc] init]; //何を目的とした配列であり、ここで初期化してます...とかです
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月17日(土) 23:36
by metaphor
VS2015でiOSとAndroidアプリが作れる環境は構築できたのですがObjective-Cは使えませんでした...。残念です、ごめん。
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月18日(日) 00:30
by あんどーなつ
Apple Developerのサンプルコードの中にnil対策が書いてありました。
https://developer.apple.com/library/con ... lementID_4
サンプルでは、ハッシュがnilの時は@"Default"という文字列を書き込んでいるみたいですね(まあ、当たり前です)。
質問では、NSMutableArrayを保存するということですので、[[NSMutableArray alloc] init]を書き込んでおけばよいかと思います。
オフトピック
ここの住人はWindowsユーザーが多いので、(Objective-Cの質問でもSwiftの質問でも)AppleのForumなど別の場所を探したほうがよろしいかと思います。
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月18日(日) 08:03
by metaphor
調べてもコンパイルができないので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];
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月18日(日) 14:15
by anonymous5
山田 さんが書きました:何も保存されていない場所を読み込むと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を保存したい
Posted: 2016年12月19日(月) 12:27
by 山田
お礼が遅くなってしまい申し訳ございません。
Swiftを使うべきなのですが、Objective-Cの関数をようやく覚えてきたのでこちらで実装しております。
if( str == nil ) みたいな形だとif文通らなくて困っておりました。
そもそも、そのパスがあるかでチェックすることで回避することができました。
http://stackoverflow.com/questions/1692 ... ta-is-null
あんどーなつ 様から頂きましたURLで、発想が見えてきて本当に助かりました!
Re: Objective-CでNSMutableArrayを保存したい
Posted: 2016年12月19日(月) 13:47
by あんどーなつ
オフトピック
山田 さん
自分はMac持ってないので間違ってたらどうしようとか思ってました。
GoogleグループやApple公式フォーラムでも日本語の投稿があまりないみたいですね。
この掲示板にも少ないですがObjective-Cができる人が(anonymous5 さん以外にも)いらっしゃるみたいなので
次に分からないことがあったらまた投稿してみてください。
ただ私の方では回答しないつもりなので1週間くらいかかるかもしれませんが、より分かりやすい回答が返ってくると
思います。