在ios中記憶體管理幾乎是每個人必須知道的乙個知識點。首先我們總結一下mrc,再通過mrc來認識arc以及自動釋放池
1.mrc
1.1 淘汰的技術
1.2 引用計數(rc)是指alloc自動分配的一塊兒儲存空間,用於儲存持有該空間的指標個數
1.3 使用retaincount方法檢視rc的值
1.4 使用retain方法將rc加1
1.5 使用release方法將rc減1(修改rc值)
1.5.1 結果不為0,release方法直接返回
1.5.2 為0,則先呼叫dealloc,然後釋放rc所在的堆空間
1.6 retain做property的引數時,可以在set方法中自動新增持有方法,使rc加1。注意:一旦新增,必須在dealloc方法中釋放
下面我們一起看一下demo,一起體會一下mrc的流程
showpoint方法為顯示點的座標
shopointrc方法為顯示該空間的rc值
point *p1 = [[point alloc] initwithx:10 andy:20];
[self showpoint:p1];
//分配空間rc+1
[self showpointrc:p1];
point *p2 = p1;
[p2 retain];//retain方法可以將指標p2持有其指向的空間
//p2也持有該空間,rc變成2
[self showpointrc:p1];
[p2 release];
//釋放指標p2,持有該空間的指標數變為1,rc為1
[self showpointrc:p1];
[p1 release];
// 已經釋放記憶體空間,無法顯示rc
// [self showpointrc:p1];
再看乙個mrc時經常出錯的demo.並且一起學習一下retain作為屬性的使用,以及dealloc方法
準備工作,建乙個circle類,circle類中有乙個屬性是point類。
可以看到如果直接釋放circle類,會造成記憶體洩漏,因為center類沒有釋放。circle類釋放了,也無法找到c.center的指標。這塊空間永遠被持有。
point *p = [[point alloc] initwithx:10 andy:20];
circle *c = [[circle alloc] init];
c.center = p;
//[c.center retain];//在property的引數中新增retain,可以自動實現此句的功能
//...
[self showpointrc:p];
[p release];
//[c.center release];//此句被放到circle類的dealloc方法中
[c release];
}circle類中的屬性,以及dealloc方法
.h中@inte***ce trcircle : nsobject
@property(retain) trpoint *center;
@property double radius;
@end
.m中@implementation trcircle
-(void)dealloc
@end
2.arc
2.1 ios5.0開始使用,ios7.0強制使用
2.2 不允許程式設計師呼叫retain、release、retaincount方法,而由編譯器自動新增完成其呼叫語句
3.自動釋放池
3.1 在arc中是已經過時的技術
3.2 是乙個集合,其中有許多物件
3.3 當自動釋放池的作用域結束時,池中的所有物件會被一次性全部釋放
3.4 工廠方法生成的物件一般會被放入自動釋放池
3.5 自動釋放池的巢狀
下面一起看一下自動釋放池的使用demo
@autoreleasepool
nslog(@"*****=");
我們先分析一下,我們沒有新增釋放p指標的操作,利用自動釋放池實現,那麼什麼時候實現該操作的呢。我們可以在point類中重寫dealloc方法,輸出釋放點的提示。應該在自動釋放池結束的地方 也就是右}的地方結束。驗證如下圖:
自動釋放池
自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...
自動釋放池
autorelease本質上就是延遲呼叫release方法 autorelease物件什麼時候釋放?引用計數為0的時候才會釋放,不是出了pool就釋放 在一些很消耗記憶體的迴圈呼叫的場景下有時需要手動干預autoreleased物件的釋放時機,不然會導致記憶體暴增,最終導致程式崩潰 nsthread...
自動釋放池
自動釋放池是允許你放棄對乙個物件的持有關係,但可以避免它立即被 的乙個工具,當從方法返回你的物件的時候,這個功能很有用。1 程式的入口處於在main 函式 這就意味著整個應用都在自動釋放池中,所有的物件最後都會被 int main int argc,char argv 2 autoreleasepo...