深いレプリケーションと浅いレプリケーション

2303 ワード

Copy & MutableCopy
copyメソッドまたはmutableCopyメソッドを使用して、オブジェクトのコピーを作成します.
copy
NSCoppyingプロトコルの実装が必要
これらは、NSString、NSArray、NSDictionaryなどの可変コピーを作成します.
mutableCopy
NSMutableCopyingプロトコルの実装が必要
作成されるのは、NSMutableString、NSMutableArray、NSMutableDictionaryなどの可変コピーです.
コピーを作成し、元のオブジェクトとコピーを変更しても干渉しないようにすることを目的としています.
深いレプリケーション&浅いレプリケーション
深くコピー:
コンテンツコピー、ソースオブジェクトとコピーは異なる2つのオブジェクトを指します.
深いコピーとは、コピー対象の具体的な内容を指し、メモリアドレスは自主的に割り当てられ、コピーが終了した後、2つのオブジェクトは同じ値を保持しているが、メモリアドレスが異なり、2つのオブジェクトも互いに影響せず、干渉しない.
copyとretainの違い:
copyは新しいオブジェクトを作成し、retainはポインタを作成し、参照オブジェクトのカウントを1つ加算します.copyプロパティは、2つのオブジェクトの内容が同じであることを示し、新しいオブジェクトretain countは1であり、古いオブジェクト参照カウントに関係なく、古いオブジェクトは変化しません.copyは、コンテキストへのオブジェクトの依存性を低減します.
ソースオブジェクト参照カウンタは変更されず、コピーカウンタは1に設定されています.
iOSはcopyとmutableCopyの方法を提供しています.その名の通り、copyはimutableのオブジェクトをコピーし、mutableCopyはmutableのオブジェクトをコピーします.
浅いレプリケーション:
ポインタコピー、ソースオブジェクトとコピーは同じオブジェクトを指します
オブジェクトの参照カウンタ+1は、retain操作を1回行ったことに相当します.
iOSではretainキーワードを使用して参照カウントを行うことで、より安全な浅いコピーです.彼はいくつかのポインタに同じメモリ空間を共有させるだけでなく、releaseでカウントの存在によってメモリを簡単に破棄することなく、より簡単に使用する目的を達成することができます.
浅いコピーは、ターゲットオブジェクトポインタとソースオブジェクトが同じメモリ領域を指すようにメモリアドレスのコピーです.次のようになります.
char* str = (char*)malloc(100);
char* str2 = str;

浅いコピーはオブジェクトの簡単なコピーにすぎず、いくつかのオブジェクトに1枚のメモリを共有させ、メモリが破棄されると、このメモリを指すいくつかのポインタを再定義して使用する必要があります.そうしないと、野ポインタになります.
浅いレプリケーションは、可変オブジェクト作成可変レプリカ(copy)のみで、その他は深いレプリケーションです.
 NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];

メモリを表示すると、stringとstringCopyは同じメモリ領域(weak reference)を指しており、参照カウントは変更されていません.stringMCopyは私たちが言った本当の意味でのレプリケーションであり、システムは新しいメモリを割り当てており、2つの独立した文字列の内容は同じです.
コピー構造:
- (id)copyWithZone:(NSZone *)zone{
    MyObj *copy = [[[self class] allocWithZone :zone] init];
    copy->name = [_name copy];
    copy->imutableStr = [_imutableStr copy];
    copy->age = age;
    return copy;
}

mutableCopyコピー構造:
- (id)mutableCopyWithZone:(NSZone *)zone{
    MyObj *copy = NSCopyObject(self, 0, zone);
    copy->name = [_name mutableCopy];
    copy->age = age;
    return copy;
}