retainとcopyにはassignの違いがあり、atomicとnonatomicの用途です.
2312 ワード
1.mallocでメモリを割り当て、ポインタaにアドレスを割り当てたとします.その後、ポインタbもこのメモリを共有することを望んで、またaをbに割り当てます.このときaとbは同じメモリを指していますが、aがこのメモリを必要としなくなったら、直接解放してもらえますか?答えは否定的です.aはbがまだこのメモリを使用しているかどうか分からないので、aが解放されると、bはこのメモリを使用するときにプログラムcrashを落とすことになります.2.1のassignの問題を知ったら、どうやって解決しますか?最も簡単な方法は、リファレンスカウント(reference counting)を使用するか、または上記の例では、メモリにリファレンスカウントを設定し、メモリが割り当てられ、aに付与された場合、リファレンスカウントは1である.aをbに付与すると参照カウントは2に増加する.この場合、aがこのメモリを使用しなくなった場合、参照カウントを1ずつ減らして、自分がこのメモリを持っていないことを示すだけです.bこのメモリを使用しなくなった場合も参照カウントを1に減らします.参照カウントが0になると、メモリがポインタで参照されなくなり、システムは直接解放することができます.3.上の2点は実はassignとretainの違いで、assignは直接値をつけて、それによって1の中の問題を引き起こすことができて、データがint、floatなどの原生のタイプの時、assignを使うことができます.retainは2で述べたように,参照カウントを用い,retainは参照カウントに1を加え,releaseは参照カウントを1減らし,参照カウントが0の場合dealloc関数が呼び出され,メモリが回収される.4.copyは、aとbがメモリを共有したくないときに使用されます.aとbはそれぞれ自分のメモリを持っている.5.atomicおよびnonatomicは、コンパイラが生成したgetterおよびsetterが原子操作であるかどうかを決定するために使用される.マルチスレッド環境では、原子操作が必要です.そうしないと、エラーの結果を引き起こす可能性があります.atomicを追加すると、setter関数は次のようになります.
if (property != newValue) {
[property release];
property = [newValue retain];
}
retain,copy,assign , copy,assign, 。
,assign retain , retaincount, 。copy, , , 。assign: , (Reference Counting)。copy: 1 , retain: , , 1 assign: (NSInteger,CGFloat) C (int, float, double, char, ) copy: NSString retain: NSObject nonatomic, , , 。 , ,
@property(nonatomic, retain) UITextField *userName //
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName release];
userName = [userName_ retain];
}
@property(retain) UITextField *userName //
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName_ {
@synchronized(self) {
[userName release];
userName = [userName_ retain];
}
}