問題タブ [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.
objective-c - NSAttributedString をエンコードするとエラーがスローされる
この質問に対する受け入れられた回答に基づいて、次のコードを作成しました。
ここで、ts は、いくつかのテキストといくつかの属性 (この場合は色) が取り込まれた NSAttributedString です。
このコードを実行すると、次のエラーが表示されます。
私は NSCoder の分野に不慣れですが、前述の質問に対する答えから、これが私がしなければならないすべてのように思えました。それは...ですか?私は何か見落としてますか?
編集:
この場合の認識されないセレクターは、NSAttributedString の色属性に送信されています。次のように文字列を初期化すると:
辞書は次のように作成されます。
そして、辞書の NSLog はこれをもたらします:
上記の CGColor のアドレスは、エラー メッセージのアドレスと一致します。
objective-c - NSCoderを使用しようとすると、起動時にアプリがクラッシュします
NSDictionary内にいくつかの詳細が保存されています。iPadでマスター/詳細ビューを使用していますが、initWithCoderメソッドを追加した後、起動時にアプリがクラッシュし、それを機能させる方法がわかりません。
NSCoderを使用する理由は、ユーザーのデータを保存し、ユーザーがアプリを再起動すると表示できるようにするためです。データの処理を容易にするために辞書内にUITextFieldsとUISegmentedControlsを格納しているため、NSUserDefaultsは実行できません。
使い方を教えてもらえますか?
objective-c - NSCoder でエンコードされたデータの保存
NSCoder を使用して NSDictionary をエンコードしていますが、アプリ内に何らかの形で保存したいと考えています。どうすればそれができるか教えてください。
ユーザーがアプリを開いたときに、以前に行ったことを確認できるようにしたいと考えています。
cocoa - NSCoding を使用して unichar 配列をエンコードする方法
カスタム オブジェクトにunichar
プリミティブの配列が含まれています。ただしencodeUnichar:ForKey
、NSCoder にはメソッドがありません。私の解決策は、2次元unichar
配列をに変換してNSString
からエンコードすることです。
ただし、文字をエンコードする方法がないため、特にスタック オーバーフローで答えが見つからなかったため、明らかな何かが欠けているように感じます。
NSString メソッドに着手する前に、NSCoding プロトコルに組み込まれているこれを行うためのより簡単な方法があるかどうか誰かが知っていますか?
ありがとうリー。
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に変更してみましたが、何も変わりませんでした。何が起こっているのかよくわからないと思います。
ios - iOS:NSMutableArrayのアーカイブ
私はグーグルでこれを検索しましたが、簡単な結果は得られませんでした。Appleのドキュメントから、次のことについて根本的な誤解があるようです。
アーカイブには、任意の複雑なオブジェクトグラフを保存できます。アーカイブは、グラフ内のすべてのオブジェクトのIDと、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。アーカイブされていない場合、再構築されたオブジェクトグラフは、いくつかの例外を除いて、元のオブジェクトグラフの正確なコピーである必要があります。
NSMutableArray
オブジェクトのコレクションであるがあると仮定しPerson
ます。各Person
オブジェクトはとを実装initWithCoder
しencodeWithCoder
ます。さらに、任意の与えられたオブジェクトPerson
は、NSMutableArray
のオブジェクト(同様にコーディング準拠)を持つことができますTask
。
私の理解では、アーカイブする方法があるため、コーディングプロトコルの実装に応じて、任意の深さのカスケードシリアル化がトリガーされます。したがって、私のView Controllerには、次のようなwillEnterBackground
機能があります。
そして私はviewDidLoad
それをします:
これはすべて起こりますが、2つのことがあります。
- 配列に含まれるオブジェクトの
initWithCoder
とは呼び出されません。encodeWithCoder
people
- 当然のことながら、結果は
self.people
サイズ0のNSMutableArrayになります。驚くべきことに、アーカイブされていないデータの長さは252バイトで、ほぼ正しく見えます。
提案?ヒント?
colors - NSCoder を使用して色を保存しますか?
NSCoder を使用して、ccc3、ccc4 などの色をどのように保存しますか (つまり、エンコードとデコードを意味します)。
サポートされていないようです。私がそれを解決できた唯一の方法は、int を保存することです。次に、色が必要なときに int から生成します。
NSCoder を使用して ccc3、ccc4 の色を保存する正式な方法はありますか?
つまり、保存したい。
しかし、NSCoder でそれらをエンコードまたはデコードする方法はないようです。
ありがとう
objective-c - encodeWithCoderを呼び出す方法
おそらくおかしな質問-どのようにencodeWithCoder
呼ばれていますか?これを使用してオブジェクトをiPhoneのファイルに保存する必要がありますが、実際にどのように呼び出されるのかわかりません。手動で呼び出す必要がありますか?NScoder
もしそうなら、私は引数の入力として何を使用しますか?
nsstring - NSString はクラス バージョン XXXX をデコードできません
独自のキー付きNSCoder
サブクラスを実装していますが、NSString のデコードに失敗しています。
次のようなことをすると:
次に、次の「キャッチされていない例外」がスローされます。
12345 が のこのメソッドから来ているところMyUnarchiver
、私は推測します:
同様に、nil
NSCoder
atをスローするNSString
とinitWithCoder:
、上記と同じエラーが発生しますが、バージョン番号は 0 です。
メソッドで何を実装する必要があるのか わからないという事実と関係があるのではないかと思いますversionForClassName:
。Archives and Serializations: Subclassing NSCoder referenceからでも、これについて多くを収集することはできません。
ios - バージョン管理されたクラスで NSCoder を使用する方法
オブジェクトのプロパティがアーカイブとアーカイブ解除プロセスの間で変化するとき、私は NSKeyedArchiver と NSKeyedUnarchiver に少し苦労しています。具体的な例を次に示します。
私はクラスを持っているTask
としましょう. 今、使用してアーカイブし、ファイルに書き込みます。後でファイルから読み込んで、目的の場所に戻ることができます。問題は、新しいプロパティを取得し、物事を面白くするために 1 つを失うときに発生します。name
desc
NSString
NSKeyedArchiver archivedDataWithRootObject
NSKeyedUnarchiver unarchiveObjectWithData(data)
Task
これはですTask
がname
、欠落しています。さらに、 typeのプロパティを追加します。そして、シミュレーターを起動します。問題は、アーカイブされていないのは古いプロパティを持つ古いものであり、新しいものではないことです。NSString
desc
dateDue
NSDate
Task
desc
dateDue
実際には、プロパティが現在のinitFromCoder
クラスに存在しない場合を考慮し、それをデコードしようとしません。
オブジェクトをシリアル化したときと同じようにオブジェクトの正確なレプリカを作成しないように NSCoder メソッドに説明する方法はありますか (これはシリアル化/逆シリアル化の定義の一部であることに気付きました)、むしろバージョンを柔軟に変更できるようにする方法はありますか?それ?
ありがとう