この質問に対する正しい答えを得ることができませんでした。重複が見つかった場合は、正しい参照リンクで複製してください。
知りたかったのは、参照カウントがインクリメントされる方法です。alloc/init と keep は参照カウントを増やしますが、'copy' も参照カウントを '1' に増やしますか?
ありがとう。
この質問に対する正しい答えを得ることができませんでした。重複が見つかった場合は、正しい参照リンクで複製してください。
知りたかったのは、参照カウントがインクリメントされる方法です。alloc/init と keep は参照カウントを増やしますが、'copy' も参照カウントを '1' に増やしますか?
ありがとう。
copy
メソッド名が示すように、レシーバーのカーボンコピーである新しいオブジェクトを作成します(実際には、copy
各クラスのメソッドの実装に依存しますが、とにかくそれがメソッドの目的です)。
したがって、実際には「の参照カウントを 1 増やす」のではなく、新しく割り当てられたオブジェクトとして refcount が 1 の新しいオブジェクトを作成し、元のオブジェクトと同じプロパティ / ivar 値を持つようにします。
したがってPerson
、プロパティname
、surname
およびを持つクラスがあると想像してください。メソッドを自分でage
実装する必要がある場合は、次のようになります。copy
-(id)copy
{
// Create a new instance
Person* mycopy = [[Person alloc] init];
// Make it an exact copy of the original
mycopy.name = self.name;
mycopy.surname = self.surname;
mycopy.age = self.age;
// and return that copy
return mycopy;
}
この場合、後でコピーを変更しても、オリジナルは変更されないことに注意してください。これは、別のインスタンスであるためです。
この原則では、元のオブジェクトの refcount は 1 ずつインクリメントされませんが、refcount が 1 の新しいオブジェクトがあり (この新しいオブジェクトを自分で作成するために alloc/init を実行したかのように)、依然として解放または自動解放する必要があります。ある時点で自分で (ARC を使用していない場合)。そのため、オブジェクトの呼び出しは、呼び出しの必要性とcopy
同じ規則に従うretain
か、ある時点で参照カウントのバランスをとる必要があるためです。alloc
release
autorelease
いくつかの例外/特殊なケースがあることに注意してNSArray
くださいNSString
. このような場合、オリジナルのクローンであるコピー (別のオブジェクト インスタンス) を作成することは合理的ですが、オリジナルは変更できず、実際には効率的ではなく、最適化できます。
したがって、およびその他のような場合NSArray
、NSString
これらは本質的に不変のクラスであるため、元の(コピーも)変更できないため、動作は同じであるため、copy
メソッドは単純に実装されるだけです。retain
もちろん、 (たとえばからmutableCopy
を取得するための) の実装は単純な保持ではなく実際のコピーを行い、変更可能なサブクラスでのメソッドの実装も同様に実際のコピーを行いますが、不変オブジェクトの不変コピーの場合、別のインスタンスを割り当てるポイントは、一般に役に立たず、メモリを消費するため、 と同じように実装されます。NSMutableArray
NSArray
copy
NSMutableString
NSMutableArray
retain
ただし、この最適化の可能性はすべて、動作 (クラスは不変であるため) もメモリ管理ポリシーも変更されません (release
によって返されるオブジェクトが必要なためcopy
) 。