簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?并區(qū)別strong(強引用)、 weak(弱引用)?什么情況使用copy,assign,和retain?
管理機制:使用了一種叫做引用計數(shù)的機制來管理內存中的對象。OC中每個對象都對應著他們自己的引用計數(shù),引用計數(shù)可以理解為一個整數(shù)計數(shù)器,當使用alloc方法創(chuàng)建對象的時候,持有計數(shù)會自動設置為1。當你向一個對象發(fā)送retain消息 時,持有計數(shù)數(shù)值會增加1。相反,當你像一個對象發(fā)送release消息時,持有計數(shù)數(shù)值會減小1。當對象的持有計數(shù)變?yōu)?的時候,對象會釋放自己所占用的內存。
retain(引用計數(shù)加1)->release(引用計數(shù)減1)
alloc(申請內存空間)->dealloc(釋放內存空間)
readwrite: 表示既有getter,也有setter (默認)
readonly: 表示只有getter,沒有setter
nonatomic:不考慮線程安全
atomic:線程操作安全 (默認)
線程安全情況下的setter和getter:
- (NSString) value {
@synchronized(self) {
return [[_value retain] autorelease];
}}
(void) setValue:(NSString)aValue {
@synchronized(self) {
[aValue retain];
[_value release];
_value = aValue;
} }
retain: release舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1
assign: 簡單賦值,不更改索引計數(shù) (默認)
copy: 其實是建立了一個相同的對象,地址不同(retain:指針拷貝 copy:內容拷貝)
strong:(ARC下的)和(MRC)retain一樣 (默認)
weak:(ARC下的)和(MRC)assign一樣, weak當指向的內存釋放掉后自動nil化,防止野指針
unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的內存區(qū)域被釋放了,這個指針就是一個野指針了。autoreleasing 用來修飾一個函數(shù)的參數(shù),這個參數(shù)會在函數(shù)返回的時候被自動釋放。