私はObjective-Cでいくつかのテストを行い、copy方法について質問があります。違いは何ですか:
id object2 = [object copy];
と:
id object2 = object;
?
object = nilこの注釈の後に違いが表示されますか?次に、最初のケースobject2はに等しいobjectが、2番目のケースは?object2に等しい メソッドを正しくnil使用するのはいつですか?copy
説明ありがとうございます。
私はObjective-Cでいくつかのテストを行い、copy方法について質問があります。違いは何ですか:
id object2 = [object copy];
と:
id object2 = object;
?
object = nilこの注釈の後に違いが表示されますか?次に、最初のケースobject2はに等しいobjectが、2番目のケースは?object2に等しい メソッドを正しくnil使用するのはいつですか?copy
説明ありがとうございます。
最初のアプローチは、オブジェクトをコピーします(<NSCopying>プロトコルに準拠している場合)。つまり、古いインスタンスと論理的に同等のオブジェクトの新しいインスタンスを作成します。2つのオブジェクトは、メモリ内の異なる場所に配置されます。
+----------+ +---------------------------------------------+
| Object 1 | | Copy of object 1, with identical properties |
+----------+ +---------------------------------------------+
^ ^
| |
"object" "object2"
object2行目は、ポインタを変数に割り当てるだけですobject2。新しいインスタンスは作成されません。ポインタはまったく同じオブジェクトを指します。
+--------+
| Object |
+--------+
^ ^
| +--------------+
"object" "object2"
object = nilの場合、違いは表示されますか?
いいえ、それ以降、両方の変数は次のようになりますnil(nilObejctive-Cでのメッセージは常にnilまたは0になります)。
コピー方法を正しく使用するのはいつですか?
既存のオブジェクトを複製する必要がある場合、たとえば、元のオブジェクトに影響を与えずにオブジェクトの一部のプロパティを変更する場合。
違いは、オブジェクトをコピーすると独立したコピーが作成され、そのオブジェクトを変更しても元のオブジェクトは影響を受けないという事実です。
たとえば、NSNumberFormatterがあります。
NSNumberFormatter* f1= [NSNumberFormatter new];
f1.numberStyle= NSNUmberFormatterDecimalStyle;
NSNumberFormatter* f2= [f1 copy];
f2.numberStyle= NSNUmberFormatterScientificStyle;
この場合、f1は変更の影響を受けません。
しかし、単純な割り当てを行う場合:
NSNumberFormatter* f1= [NSNumberFormatter new];
f1.numberStyle= NSNUmberFormatterDecimalStyle;
NSNumberFormatter* f2= f1;
f2.numberStyle= NSNUmberFormatterScientificStyle;
次に、f1も変更の影響を受けます。
不変オブジェクトを使用する場合は、この違いを気にする必要はありません。
標準のobject2=objectを使用することは、参照またはポインティングの割り当てです。これは、objectとobject2の両方が同じメモリ領域を指している必要があることを意味します。いずれかのオブジェクトに適用された変更は、両方に同時に影響を与える必要があります(より正確には、両方がまったく同じメモリ位置から読み取りと書き込みを行います)。
コピーを使用すると、メモリ内に新しいセクションが作成され、オブジェクトと同じ値が入力されます。このシナリオでは、同じ値で始まる2つの別々のメモリ領域があります。オブジェクトを編集すると、その変数名のみのメモリ内の値が編集されます。オブジェクト2の値を編集すると、オブジェクト2のメモリ内の値のみが編集されます。
両方の変数名がメモリのまったく同じ領域を指すことを意味する場合は、参照メソッドを使用してメモリ使用量とオーバーヘッドを制限する必要があります。これらの2つのオブジェクトが互いに独立していることを意図している場合は、コピーを作成して維持する必要があります。