問題タブ [nscoder]

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.

0 投票する
2 に答える
3242 参照

objective-c - NSAttributedString をエンコードするとエラーがスローされる

この質問に対する受け入れられた回答に基づいて、次のコードを作成しました。

ここで、ts は、いくつかのテキストといくつかの属性 (この場合は色) が取り込まれた NSAttributedString です。

このコードを実行すると、次のエラーが表示されます。

私は NSCoder の分野に不慣れですが、前述の質問に対する答えから、これが私がしなければならないすべてのように思えました。それは...ですか?私は何か見落としてますか?


編集:

この場合の認識されないセレクターは、NSAttributedString の色属性に送信されています。次のように文字列を初期化すると:

辞書は次のように作成されます。

そして、辞書の NSLog はこれをもたらします:

上記の CGColor のアドレスは、エラー メッセージのアドレスと一致します。

0 投票する
1 に答える
132 参照

objective-c - NSCoderを使用しようとすると、起動時にアプリがクラッシュします

NSDictionary内にいくつかの詳細が保存されています。iPadでマスター/詳細ビューを使用していますが、initWithCoderメソッドを追加した後、起動時にアプリがクラッシュし、それを機能させる方法がわかりません。

NSCoderを使用する理由は、ユーザーのデータを保存し、ユーザーがアプリを再起動すると表示できるようにするためです。データの処理を容易にするために辞書内にUITextFieldsとUISegmentedControlsを格納しているため、NSUserDefaultsは実行できません。

使い方を教えてもらえますか?

0 投票する
1 に答える
221 参照

objective-c - NSCoder でエンコードされたデータの保存

NSCoder を使用して NSDictionary をエンコードしていますが、アプリ内に何らかの形で保存したいと考えています。どうすればそれができるか教えてください。

ユーザーがアプリを開いたときに、以前に行ったことを確認できるようにしたいと考えています。

0 投票する
1 に答える
259 参照

cocoa - NSCoding を使用して unichar 配列をエンコードする方法

カスタム オブジェクトにunicharプリミティブの配列が含まれています。ただしencodeUnichar:ForKey、NSCoder にはメソッドがありません。私の解決策は、2次元unichar配列をに変換してNSStringからエンコードすることです。

ただし、文字をエンコードする方法がないため、特にスタック オーバーフローで答えが見つからなかったため、明らかな何かが欠けているように感じます。

NSString メソッドに着手する前に、NSCoding プロトコルに組み込まれているこれを行うためのより簡単な方法があるかどうか誰かが知っていますか?

ありがとうリー。

0 投票する
2 に答える
2208 参照

objective-c - NSStreamを介して送信すると、データが切り捨てられます

さて、私は一日中このバグに直面していて、根本的な問題に絞り込んだと思います。

バックグラウンド:

私は自分のバージョンを作成し、iOS 5でBluetooth経由のBonjourを許可する必要があるアプリに取り組んでいNSNetServiceますNSNetServiceBrowser。このプロジェクトを開始する前は、ネットワークプログラミングについて何も知らなかったので、これは素晴らしい冒険でした。私はさまざまなサンプルプロジェクトや古典的なUnixネットワークプログラミングの教科書から多くのことを学びました。私の実装は、主にAppleのDNSSDObjectsサンプルプロジェクトに基づいています。サービスが解決されたら、実際にデバイス間を接続するコードを追加しました。anNSInputStreamとanNSOutputStreamはで達成されCFStreamCreatePairWithSocketToHost( ... )ます。

問題:

この接続を介してデータを送信しようとしています。データは、整数、少数NSStrings、およびでNSDataアーカイブされたオブジェクトで構成されNSKeyedArchiverます。のサイズNSDataは約150kbなので、メッセージ全体のサイズは約160kbです。接続を介してデータを送信した後、アーカイブを解除しようとすると、次の例外が発生します...

さらに調べてみると、受信したデータが約2kbしかないことに気づきました。メッセージが切り捨てられているため、アーカイブが「理解できない」状態になっています。

関連する可能性のあるコード:

接続されているすべてのデバイスにデータを送信する方法

実際にデータを書き込むPeerクラスのメソッドNSOutputStream

ストリームイベントを処理する(データを「受信する」)ためのNSStreamDelegateメソッド

このコードのバッファサイズは32768b/ cで、これは私が学んだサンプルコードにあったものです。それは任意ですか?バッファが小さすぎるだけだと思って200000に変更してみましたが、何も変わりませんでした。何が起こっているのかよくわからないと思います。

0 投票する
1 に答える
370 参照

ios - iOS:NSMutableArrayのアーカイブ

私はグーグルでこれを検索しましたが、簡単な結果は得られませんでした。Appleのドキュメントから、次のことについて根本的な誤解があるようです。

アーカイブには、任意の複雑なオブジェクトグラフを保存できます。アーカイブは、グラフ内のすべてのオブジェクトのIDと、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。アーカイブされていない場合、再構築されたオブジェクトグラフは、いくつかの例外を除いて、元のオブジェクトグラフの正確なコピーである必要があります。

NSMutableArrayオブジェクトのコレクションであるがあると仮定しPersonます。各Personオブジェクトはとを実装initWithCoderencodeWithCoderます。さらに、任意の与えられたオブジェクトPersonは、NSMutableArrayのオブジェクト(同様にコーディング準拠)を持つことができますTask

私の理解では、アーカイブする方法があるため、コーディングプロトコルの実装に応じて、任意の深さのカスケードシリアル化がトリガーされます。したがって、私のView Controllerには、次のようなwillEnterBackground機能があります。

そして私はviewDidLoadそれをします:

これはすべて起こりますが、2つのことがあります。

  1. 配列に含まれるオブジェクトのinitWithCoderとは呼び出されません。encodeWithCoderpeople
  2. 当然のことながら、結果はself.peopleサイズ0のNSMutableArrayになります。驚くべきことに、アーカイブされていないデータの長さは252バイトで、ほぼ正しく見えます。

提案?ヒント?

0 投票する
1 に答える
142 参照

colors - NSCoder を使用して色を保存しますか?

NSCoder を使用して、ccc3、ccc4 などの色をどのように保存しますか (つまり、エンコードとデコードを意味します)。

サポートされていないようです。私がそれを解決できた唯一の方法は、int を保存することです。次に、色が必要なときに int から生成します。

NSCoder を使用して ccc3、ccc4 の色を保存する正式な方法はありますか?

つまり、保存したい。

しかし、NSCoder でそれらをエンコードまたはデコードする方法はないようです。

ありがとう

0 投票する
1 に答える
1719 参照

objective-c - encodeWithCoderを呼び出す方法

おそらくおかしな質問-どのようにencodeWithCoder呼ばれていますか?これを使用してオブジェクトをiPhoneのファイルに保存する必要がありますが、実際にどのように呼び出されるのかわかりません。手動で呼び出す必要がありますか?NScoderもしそうなら、私は引数の入力として何を使用しますか?

0 投票する
1 に答える
121 参照

nsstring - NSString はクラス バージョン XXXX をデコードできません

独自のキー付きNSCoderサブクラスを実装していますが、NSString のデコードに失敗しています。

次のようなことをすると:

次に、次の「キャッチされていない例外」がスローされます。

12345 が のこのメソッドから来ているところMyUnarchiver、私は推測します:

同様に、nil NSCoderatをスローするNSStringinitWithCoder:、上記と同じエラーが発生しますが、バージョン番号は 0 です。

メソッドで何を実装する必要があるのか​​ わからないという事実と関係があるのではないかと思いますversionForClassName:Archives and Serializations: Subclassing NSCoder referenceからでも、これについて多くを収集することはできません。

0 投票する
1 に答える
601 参照

ios - バージョン管理されたクラスで NSCoder を使用する方法

オブジェクトのプロパティがアーカイブとアーカイブ解除プロセスの間で変化するとき、私は NSKeyedArchiver と NSKeyedUnarchiver に少し苦労しています。具体的な例を次に示します。

私はクラスを持っているTaskとしましょう. 今、使用してアーカイブし、ファイルに書き込みます。後でファイルから読み込んで、目的の場所に戻ることができます。問題は、新しいプロパティを取得し、物事を面白くするために 1 つを失うときに発生します。namedescNSStringNSKeyedArchiver archivedDataWithRootObjectNSKeyedUnarchiver unarchiveObjectWithData(data)Task

これはですTaskname、欠落しています。さらに、 typeのプロパティを追加します。そして、シミュレーターを起動します。問題は、アーカイブされていないのは古いプロパティを持つ古いものであり、新しいものではないことです。NSStringdescdateDueNSDateTaskdescdateDue

実際には、プロパティが現在のinitFromCoderクラスに存在しない場合を考慮し、それをデコードしようとしません。

オブジェクトをシリアル化したときと同じようにオブジェクトの正確なレプリカを作成しないように NSCoder メソッドに説明する方法はありますか (これはシリアル化/逆シリアル化の定義の一部であることに気付きました)、むしろバージョンを柔軟に変更できるようにする方法はありますか?それ?

ありがとう