問題タブ [nscopying]
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 - カスタムクラスで-mutableCopyWithZone:を使用すると、不変になります
NSCopying
とに準拠するカスタムクラスを作成しましたNSMutableCopying
。
との実装を追加しましたが、オブジェクトを呼び出して別のメソッドを呼び出そうとすると、ivarを呼び出しても、一部のivarが不変になっているため、クラッシュし-copyWithZone:
ます。-mutableCopyWithZone:
-mutableCopy
-mutableCopyWithZone:
クラスをコピーする方法は次のとおりです。
(コードは、ivarで+flip:
使用しようとするため、removeObjectAtIndex:
失敗します)addObject:
NSMutableArray
クラスをコピーする方法は次のとおりです。
なぜ失敗するのかはわかりませんが、なぜそれが作成されず、変更可能でないのかは本当にわかりませarray
んobjects
。
助けていただければ幸いです。
ios - カスタム オブジェクトの NSCopying 配列
すべてのリストを管理する Singleton オブジェクトがあります。これを ListStore と呼びます。
ListStore には、リストを格納する可変配列があります。
Lists には、Things を格納する可変配列があります。
バックグラウンド プロセスはいつでも、ListStore を通過し、すべてのリストをループして処理する可能性がありますが、ユーザーはリストを操作している可能性があります。
「列挙中にオブジェクトが変更された」タイプのエラーを防ぐために、次のようにします。
newLists
コピーしたからこそ、メンバー全員がちゃんとコピーされると最初は思っていました。そうではないことがわかりました。「列挙中にオブジェクトが変更されました」というエラーが引き続き表示されますが、今回は で発生していlist.things
ます。
セットアップで NSCopying を使用して、次のように言うことはできますか?
copyWithZone:
を呼び出すLists
ので、copyWithZone:
次にthings
?
このように設定しようとしましたcopyWithZone:
が、呼び出されませんでした。
簡単に言うことができることはわかっていますNSArray *newList = [list.things copy]
が、少なくとも NSCopying についてよりよく理解したいと思います。
iphone - NSCopy を使用して、ポインターを含むカスタム オブジェクトをコピーしますか?
NSCopy の使い方を学んでいます。UIScrollView の ImageView である、使用しているカスタム オブジェクトのコピーを作成したいと考えています。
次のように NSCopying プロトコルを実装しようとしています。
次に、オブジェクトを別のクラスにコピーします。
コピーは作成されますが、奇妙な問題が 1 つあります。コピーされたオブジェクトの ImageView (UIImageView) および ImageToShow (UIImage) プロパティは、元のオブジェクトと同じように見えます。この種のコピー コードは、ImageView と ImageToShow の新しいバージョンを作成するのではなく、ポインターを再指定しているため、理にかなっています。
私の質問は、他のオブジェクトへのポインターを含むオブジェクトのコピーを作成するにはどうすればよいですか?
ありがとう !
objective-c - mutableCopyWithZone 紛らわしい要件?
明確化: 問題は、変更可能か不変かについてではなく、正しいクラスのインスタンスを作成するスーパーへの呼び出しについてです。[[self class] alloc]
基本クラスで使用することは考えていませんでしたが、これで問題が解決するようです。何も良いことがない場合は、次の数時間でその anser を受け入れます :)
それは非常に紛らわしいです。検討
仕様に従った場合、このコードがどのように正しい可能性があるのか わかりません。
への呼び出しが[super mutableCopyWithZone: zone]
返されたとき、基本クラスは独自の ivar に十分なスペースしか割り当てていないと予想しています。Derived
インスタンスが独自の ivar 用により多くのスペースを必要としていると判断する方法はありません。
ドキュメントが意味することは、実際には何ですか? これをどのように実装すればよいですか?
objective-c - 「親」プロパティを正しく NSCopying して、既にコピーされた親を指すようにする
クラス B のプロパティを含むクラス A があります。クラス B には、その「親」クラス A への弱い参照があります。両方のクラスが NSCopying を実装しています。
クラス B で NSCopying をどのように実装する必要があるかはわかりません。2 つの明白な選択肢があります。
- 親プロパティをコピーしたクラスに割り当てます
- 親プロパティをコピーして、コピーしたクラスに割り当てます
最初のケースでは、B の親プロパティは元の A を指します。2 番目のケースでは、親プロパティは完全に新しいコピーです。
NSCopying のプロセス中に親プロパティが新しく作成された A のコピーを指すように、クラス B を正しくコピーするにはどうすればよいですか?
最も簡単な方法は、クラス A の copyWithZone: から親プロパティを更新することだと思います。しかし、クラス B 内からそれを行う方法はありますか?
objective-c - Objective-Cでインスタンスタイプをコピーの戻り値の型として使用していますか?
instancetype
および関連するメソッドの戻り値として使用init
することを推奨する方法です。 最新のclang 機能を参照してください。copyWithZone:
ただし、NSCopying
プロトコルの戻り値に関するベスト プラクティスは何ですか (以前のベスト プラクティスについては、このスレッドを参照してください)。clang の記事のメソッドの命名スキームからクラスを推論するためのルールには言及されていませんが、メソッドの戻り値とは異なる必要がある理由がわかりませんalloc
。
copy
-methodsの型推論は機能しませんか? それでも返すinstancetype
必要がありますか、それとも実際に返す特定のクラス型ですか?
objective-c - 変更可能なサブクラスを持つ不変クラスの copyWithZone で [自己保持] を返すことは本当に安全/良い考えですか?
不変クラスは、次の方法で copyWithZone を非常に効率的に実装できることがよくあります。
この実装の背後にある考え方は明らかです。オリジナルとコピーはどちらも不変のインスタンスであり、常にまったく同じコンテンツを保持します。そのため、オリジナルを保持してコピーのオーバーヘッドを回避することで、両方が同じストレージを指すようにしないでください。
しかし、変更可能なサブクラスがあるとどうなるでしょうか? サブクラスがその基本クラスの実装の詳細を気にする必要がないクリーンなアーキテクチャでは、可変サブクラスは次のように copyWithZone を実装しても問題ありません。
しかし、これは copyWithZone の上記のスーパークラス実装で何を意味するのでしょうか? サブクラスは可変であるため、コピーは依然として不変ですが、オリジナルは現在可変ですが、サブクラス copyWithZone は、スーパークラスの実装のおかげで、それ自体の保持されたインスタンスで動作します: self と myCopy は両方とも同じインスタンスを指します。 mutableOriginal.myMember の値を変更すると、immutableCopy.myMember も変更されますが、これは明らかに間違っています。
不変クラスは、次の方法で copyWithZone をより適切に実装するべきではないでしょうか?
ios - 配列自体をコピーするときに NSArray のすべてのオブジェクトをコピーする方法
私はオブジェクトの配列を持っています
配列とそのすべての内容をコピーしたい
「オブジェクト」は NSCopying を実装します
やってると思った
内部に含まれるオブジェクトで copyWithZone をトリガーします。
残念ながらそうではありません...
これはどのように行うことができますか?