[解決済み] NSUserDefaultsのNSMutableArrayにカスタムオブジェクトを格納する
2023-02-03 14:47:34
質問
最近、私の iPhone アプリの検索結果を NSUserDefaults コレクションに格納しようとしています。また、これを使用してユーザー登録情報をうまく保存していますが、なぜかカスタム Location クラスの NSMutableArray を保存しようとすると、いつも空が返されます。
この投稿のように、NSMutableArray を NSData 要素に変換してみましたが、同じ結果になります ( iPhone で NSUserDefaults を使用して整数配列を保存することは可能ですか? )
私が試したコードサンプルは、以下の通りです。
保存します。
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
または
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
または
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
読み込みます。
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
または
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
または
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
以下のアドバイスに従って、私は自分のオブジェクトにNSCoderを実装しました(NSStringの使いすぎは無視してください、その一時的なものです)。
#import "Location.h"
@implementation Location
@synthesize locationId;
@synthesize companyName;
@synthesize addressLine1;
@synthesize addressLine2;
@synthesize city;
@synthesize postcode;
@synthesize telephoneNumber;
@synthesize description;
@synthesize rating;
@synthesize priceGuide;
@synthesize latitude;
@synthesize longitude;
@synthesize userLatitude;
@synthesize userLongitude;
@synthesize searchType;
@synthesize searchId;
@synthesize distance;
@synthesize applicationProviderId;
@synthesize contentProviderId;
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
self.locationId = [coder decodeObjectForKey:@"locationId"];
self.companyName = [coder decodeObjectForKey:@"companyName"];
self.addressLine1 = [coder decodeObjectForKey:@"addressLine1"];
self.addressLine2 = [coder decodeObjectForKey:@"addressLine2"];
self.city = [coder decodeObjectForKey:@"city"];
self.postcode = [coder decodeObjectForKey:@"postcode"];
self.telephoneNumber = [coder decodeObjectForKey:@"telephoneNumber"];
self.description = [coder decodeObjectForKey:@"description"];
self.rating = [coder decodeObjectForKey:@"rating"];
self.priceGuide = [coder decodeObjectForKey:@"priceGuide"];
self.latitude = [coder decodeObjectForKey:@"latitude"];
self.longitude = [coder decodeObjectForKey:@"longitude"];
self.userLatitude = [coder decodeObjectForKey:@"userLatitude"];
self.userLongitude = [coder decodeObjectForKey:@"userLongitude"];
self.searchType = [coder decodeObjectForKey:@"searchType"];
self.searchId = [coder decodeObjectForKey:@"searchId"];
self.distance = [coder decodeObjectForKey:@"distance"];
self.applicationProviderId = [coder decodeObjectForKey:@"applicationProviderId"];
self.contentProviderId = [coder decodeObjectForKey:@"contentProviderId"];
}
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:locationId forKey:@"locationId"];
[coder encodeObject:companyName forKey:@"companyName"];
[coder encodeObject:addressLine1 forKey:@"addressLine1"];
[coder encodeObject:addressLine2 forKey:@"addressLine2"];
[coder encodeObject:city forKey:@"city"];
[coder encodeObject:postcode forKey:@"postcode"];
[coder encodeObject:telephoneNumber forKey:@"telephoneNumber"];
[coder encodeObject:description forKey:@"description"];
[coder encodeObject:rating forKey:@"rating"];
[coder encodeObject:priceGuide forKey:@"priceGuide"];
[coder encodeObject:latitude forKey:@"latitude"];
[coder encodeObject:longitude forKey:@"longitude"];
[coder encodeObject:userLatitude forKey:@"userLatitude"];
[coder encodeObject:userLongitude forKey:@"userLongitude"];
[coder encodeObject:searchType forKey:@"searchType"];
[coder encodeObject:searchId forKey:@"searchId"];
[coder encodeObject:distance forKey:@"distance"];
[coder encodeObject:applicationProviderId forKey:@"applicationProviderId"];
[coder encodeObject:contentProviderId forKey:@"contentProviderId"];
}
どのように解決するのですか?
カスタムオブジェクトを配列で読み込む場合、配列の取り込みはこのようにしました。
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
objectArray = [[NSMutableArray alloc] init];
}
ユーザーデフォルトから返されるデータがnilでないことを確認する必要があります。nilからアーカイブを解除するとクラッシュが発生すると思いますので。
アーカイブは以下のコードで簡単にできます。
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];
f3lixが指摘したように、カスタムオブジェクトはNSCodingプロトコルに準拠させる必要があります。 以下のようなメソッドを追加すれば、うまくいくはずです。
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:label forKey:@"label"];
[coder encodeInteger:numberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [super init];
if (self != nil)
{
label = [[coder decodeObjectForKey:@"label"] retain];
numberID = [[coder decodeIntegerForKey:@"numberID"] retain];
}
return self;
}
関連
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] iOSで画面の幅と高さを取得する方法は?
-
[解決済み】iPhoneアプリケーションにカスタムフォントを埋め込むことはできますか?
-
[解決済み】NSUserDefaultsをクリアする。
-
[解決済み】NSUserDefaultsに文字列を保存しますか?
-
[解決済み] ARC対応コードにおける「このブロック内で強く[オブジェクト]を捕捉するとretainサイクルになる可能性があります」という警告の修正
-
[解決済み] iOS 7で完全に透明なナビゲーションバーを作成する方法
-
[解決済み] iOS 7のUITableViewCellとUITextViewの高さ?
-
[解決済み] swiftのコード実行のエントリーポイントは何ですか?
-
[解決済み] UIImageから基礎となるNSDataを取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] iOSで画面の幅と高さを取得する方法は?
-
[解決済み] iOS 2.0でのメールアドレス検証のベストプラクティスとは?
-
[解決済み] iOSでNSUserDefaultsがNSMutableDictionaryの保存に失敗するのはなぜですか?
-
[解決済み] ARC対応コードにおける「このブロック内で強く[オブジェクト]を捕捉するとretainサイクルになる可能性があります」という警告の修正
-
[解決済み] iOS 7で完全に透明なナビゲーションバーを作成する方法
-
[解決済み] UIViewを強制的に再描画させる最も堅牢な方法は何ですか?
-
[解決済み] iOS 7のUITableViewCellとUITextViewの高さ?
-
[解決済み] swiftのコード実行のエントリーポイントは何ですか?
-
[解決済み] UIImageから基礎となるNSDataを取得する