問題タブ [nscoding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - Objective-C – NSCoding を使用してアプリを App Store に更新する
NSCoding
オブジェクトをエンコードし、アプリを起動するたびにデータをダウンロードする必要のない「キャッシュ」機能としてディスクに保存するために使用しています。現在、このデータをアプリの Documents フォルダーに保存していますが、アプリの更新時に削除されません。
したがって、私の懸念は、インスタンス変数を追加するなど、クラスを更新することです。そして、アプリを App Store にアップロードします。そのため、ユーザーが新しいバージョンに更新すると、Documents フォルダーに保存されている古いオブジェクトは、新しいバージョンで追加した新しいインスタンス変数なしでエンコードされます。私のアプリが起動時に保存されたオブジェクトをデコードしようとすると、ドキュメントフォルダーの「古い」オブジェクトがこの新しい変数でエンコードされていないため、失敗しますか?
この問題にどのように対処しますか? クラスを最初から「正しく」書くようにしてください。最終的にはクラスの 1 つを変更し、ディスク上に保存された古いオブジェクトを破棄する必要があると確信しています。
iphone - エンコードするとNSArrayオブジェクトはどうなりますか?
NSCodingを利用してNSObjectをdocumentPathに保存するアプリケーションを構築しています。私はこれを行うのに問題はありません、私は何かについて興味があります。
NSCodingデリゲートメソッドを実装するMACompanyがあります。
ご覧のとおり、カスタムNSObjects(MAStore)のNSArrayがあります。これらのオブジェクトのそれぞれは、同じNSCodingを実装します。
ただし、私の質問は、encodeWithCoder:(NSCoder *)encoder
MAStoreでメソッドを呼び出して、に到達すると、 NSArray[encoder encodeObject:stores forKey:kStores]
内に格納されているすべてのオブジェクトに、実装されている場合に呼び出されるメソッドが含まれるかどうかです。stores
encoderWithCoder:(NSCoder *)encoder
編集
私がこれを求めている理由は、私がそのようなことをすることに時間を費やす前に、それがうまくいくかどうかを知りたいからです。より多くのカスタムNSObjectを保持するNSArrayを持つ複数のカスタムNSObjectがあります。それが機能しないことを見つけるのは長いプロセスになるでしょう。
objective-c - NSKeyedUnarchiver はデバイス上で -initWithCoder: を呼び出していません (ただし、シミュレーターでは問題ありません)
次のように、オブジェクトをエンコードしてファイルに保存しています。
[NSKeyedArchiver archiveRootObject:self.parent toFile:@"gameScene.plist"];
次のようにデコードします。
scene = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"gameScene.plist"] retain];
initWithCoder
シミュレーターでは、上記のデコード コードはクラスのメソッドを適切に呼び出します。しかし、デバイスで同じことを実行すると、「initWithCoder is not called nor the
init」メソッドと「nil」オブジェクトが返されます。
誰かがここで何が悪いのか説明してもらえますか?
編集:テスト目的で、サブオブジェクトをデコードして my のすべてのエンコーディングをコメントアウトする代わりに、init
との両方で同じステートメントのセットを指定しました。initWithCoder
initWithCoder
encodeWithCoder
iphone - 私は何を間違っていますか?NSFileManager の問題
現在、かなり大きな iPhone アプリケーションを作成しています。とにかく思ったより大きい。アプリケーションの全体的な考え方は、Web サービスから JSON を取得し、それをすべてカスタム NSObject に並べ替えてリンクし、表示することです。
これはすべてうまくいきます。ただし、ユーザーがインターネットに接続していないデバイスでこの情報を表示できるようにするため、提示している情報を各アプリケーションが持つドキュメント フォルダーに保存する必要があります。
私は基本的に、Documents ディレクトリのサブディレクトリに保存するために必要なすべてのカスタム NSObject に NSCoding プロトコルを実装しました。
これはすべて、ここのこの関数によって実現されます。
ユーザーが最初にアプリケーションをロードするとき ( application didFinishLaunchingWithOptions:
) と、ユーザーがバックグラウンドになった後にアプリケーションを開くとき( ) に、次の要求を行いますapplicationWillEnterForeground:
。
これで問題なく動作し、このファイルからプルすることもできます。ただし、Xcode のデバッガーがアプリケーションに接続されている場合にのみ、このファイルに格納されているデータを取得できます。が停止するとすぐに、データが破損し、元のデータが含まれなくなります。
データはまだそこに保存されており、作成されたファイルを見ることができますが、ファイル内に保存されている実際のデータ自体が間違っています...
上記のロジックを使用してデータをファイルに保存し、プルして共有オブジェクトを再作成するべきではありませんか? 他の誰かがそのようなことをしようとして成功しましたか? この奇妙な問題に遭遇した理由はありますか? 他の誰かがこの問題を抱えていますか?
それを機能させるためにあらゆる種類のさまざまな方法を試してきましたが、何も達成できませんでした。私ができる必要があるのは、更新が必要になるまで、そこにデータを永続的に保存できることだけです...
objective-c - UIImagesを使用したNSMutableArrayのNSUserDefaultsへの保存
5つのUIImageを含むNSMutableArrayをNSUserDefaultsに保存しようとしましたが、機能しませんでした。警告が出ました
OK、アレイをNSDataにアーカイブする必要があるようです。しかし、どうすればUIImageをNSCodingに準拠させることができますか?最初に画像をNSDataに変換する必要がありますか、それとももっと簡単な方法がありますか?
objective-c - Objective C: プリミティブとオブジェクトを含む NSDictionary を保存しようとしていますが、カスタム オブジェクトを追加しようとするとエラーが発生しました
だから私は「ボックス」と呼ばれるこのカスタムオブジェクトを作成しましたが、そのオブジェクトに対してエラーがスローされています。私の NSDictionary の内部は...
一番上に作成し、最後に NSDictionary に追加した box オブジェクトに注目してください。ボックスがそこにない前は、すべて正常に機能していましたが、カスタム オブジェクト「ボックス」を追加すると、保存できなくなりました。
これがエラーでした
どんな助けでも大歓迎です!!!!
objective-c - Objective C の汎用ゲーム ステート シングルトンはどこにありますか?
NSCoder 内にゲーム状態シングルトンを使用して保存したいのですが、NSKeyedArchiver/NSCoder ルーチンを使用してデータを保存およびロードする一般的な状態管理を見つけるのは非常に難しいと感じています。
誰かが良いチュートリアル、またはゲーム状態のシングルトンとして使用するための一般的なコードに私を案内してくれるかどうか疑問に思っています.NSCoderに保存/ロードしますか?
ありがとう
objective-c - NSCoding を単体テストするには?
NSCoding、より正確には NSKeyedArchiver を使用してデータを永続化する iOS アプリケーションがあります。このアプリケーションはすでに App Store で入手できます。
アプリケーションのバージョン 2 に取り組んでおり、データ モデルを変更する必要があります。そのため、データ モデルの移行を処理する必要があります。単体テストでカバーしてほしい。
私のテストでは、古いデータ モデルを使用して永続化されたデータを動的に生成し、移行を開始して、すべてがうまくいったかどうかを確認したいと考えています。
現在、オブジェクトのアーカイブは次のようになっています。
問題は、バージョン 2 のアプリケーションで MyDataModelObject がリファクタリングされたり、削除されたりする可能性があることです。したがって、テストでこのクラスを使用して「古いバージョンのアーカイブ」を生成することはできません。
encodeWithCoder:
このクラスを使用せずにクラスのメソッドで行われることをシミュレートする方法はありますか?
私が達成したいことは次のとおりです
objective-c - NSCoder をサブクラス化する場合、コレクション クラス (つまり、NSArray、NSDictionary) もサブクラス化する必要がありますか?
NSCoder
独自のファイル形式を読み書きするためにサブクラス化するというアイデアを検討しています。これには、適切にエンコードされるようにサブクラスNSArray
化しNSDictionary
てオーバーライドする必要があるかもしれないと考え始めています。encodeWithCoder:
NSCoder
関連するプロトコルNSCoding
は自給自足である必要があるため、これを行うのは気が進まない...プロトコルに従ってサブクラス化クラスを要求することは、悪い設計のように思えます。私は何かを誤解しているか、考えすぎていますか?!?
少し
詳しく説明します。
たとえば、ファイル形式で、アイテムのリストが次のようにエンコードされることが規定されている場合:
配列をエンコードするには、次のencodeWithCoder:
ようにする必要があると思います。
私は NSArrayencodeWithCoder:
がどのように実装されているかを無視しているので、NSCoder クラスを適切に使用するにはオーバーライドする必要があると思います。
objective-c - NSValue を NSData に変換して元に戻す方法は?
Game Centerを使用してネットワーク経由でオブジェクトを送信するために、オブジェクトに追加する必要があるNSValue
( KVC を介して取得した)多数のオブジェクトがあります。明らかに、より多くの KVC ( ) のために、バックを変換する必要もあります。valueForKey
NSData
NSValue
NSData
setValue:forKey:
それぞれの正確なタイプがわからないので、およびNSValue
によって提供されるインターフェースの使用に限定されます。ポインター型ではないことに注意してください。NSValue
NSData
NSValue
[NSData dataWithValue:value]
似たようなものがないことに驚いてい[value dataWithEncoding:]
ます。しかし、おそらく私は盲目で、明らかな選択肢が見えていません。getValue:
を使用して値をバッファーにコピーすることを考えましたが、それを使用してすべての可能な型と比較するvoid*
以外に、バッファーの長さを決定するにはどうすればよいでしょうか?objCType
これについてどうすればよいですか?
注:
NSKeyedArchiver
非常に効率が悪いため、問題外です。4 バイトのフロートは 142 バイトにアーカイブされNSData
、8 バイトCGPoint
は にアーカイブされると 260 バイトを使用しNSData
ます。送信されるデータの量を最小限に抑えることは、私がやっていることにとって非常に重要です。