ios中MRC的記憶體管理

2021-07-09 02:43:12 字數 2523 閱讀 5965

person * person=[[person

alloc]init];

person* person僅是乙個指標,它建立了乙個指標指向了乙個物件

[[person

alloc]init]這才是乙個物件

person

* person是系統給他分配的空間,不需要我們來進行管理

nslog

(@"物件的位址:%p,指標的位址:%p",person,&person);

0x100202eb0相當於房間號

0x7fff5fbff8a8這個是系統分配給指標的位址

當物件銷毀,person指向的空間還是存在的,但是空間裡放的已經不是原來的物件,如果對乙個不存在的物件傳送乙個訊息或呼叫乙個方法程式就會崩潰

乙個物件從空間裡移出來,如果對給這個物件傳送訊息就會發生問題,就是殭屍物件

根本就不存在過渡釋放,當乙個物件不存在,再對這個物件傳送這個物件不存在的訊息(release訊息)時這個物件就會崩潰

person * person=[[person

alloc]init];

nslog

(@"物件的位址:%p,指標的位址:%p",person,&person);

[person release];

當物件釋放以後,指標還是指向的,所以依然可以列印出和上面相同的位址 

nslog

(@"物件的位址:%p,指標的位址:%p",person,&person);

走到這一步就會崩潰

nslog(@"

物件:%@"

,person);系統會預設拼接description方法

列印nslog(@"

物件:%@",person);相當於

nslog(@"

物件:%@",[person description])

//只要沒有retain ,copy,alloc的都是弱引用

//a進了辦公室,開了裡面的燈

person * persona=[[person

alloc]init];

//c進了辦公室,借用了裡面的光,無強引用指向

person * personc=persona;

//a和c都使用裡面的光,都可以向物件發訊息

[persona printf];

[personc printf];

//b進了辦公室,同時b可以控制開關

person * personb=[persona retain];

//a出辦公室,燈沒有關,release不具備關燈的方法,release並沒有銷毀物件,只是許可權變了,指標的顏色由紅色變成綠色,b依然有指標指向,在有強引用指向的情況下,a依然可以傳送訊息,但是一般我們遵守原則,一般不再對a傳送訊息,因為我不能確定a指向的空間其他物件b指向的紅線什麼時候消失。(只要有一條紅線存在,都可以使用這個物件)。

[persona release];

//c雖然是弱引用,但是如果c傳送一條release訊息會把b物件變成弱引用,會造成這塊位址沒有強引用指向,a,b,c,任何物件再傳送訊息程式都會崩潰,所以我們要遵守規則,誰引用誰release

//[personc release];

//不應通過列印retaincount來判斷應不應該release,而是應該通過retain,copy,alloc,new來判斷,強引用的物件指標去release

[persona printf];

[personc printf];

[personb printf];

//b出辦公室,燈沒有關

//  [personb release];

//dealloc是用來關燈的,也就是用來銷毀物件的,不能手動呼叫,只能讓系統去呼叫

只要有乙個強引用指向,所有的指標都可以操作這個物件

autorelease

@autoreleasepool

return

0;*********************************************=

//弱引用,如果自己是強引用自己進行release或者autorelease,盡量少用autorelease,因為autorelease有延遲,但有些情況必須使用。

pig * pig=[pig

pig];

/*+(pig *)pig

*/nsmutablearray* imagearr=[[nsmutablearray

alloc

]init];

for (int i=0; i<1000; i++)

}用copy還是用retain

@autoreleasepool

person需要遵守這兩個協議,實現下面兩個方法

- (id)copywithzone:(nszone *)zone

- (id)mutablecopywithzone:(nszone *)zone

記憶體管理 MRC

記憶體管理,涉及的操作 記憶體管理的管理範圍 只有oc物件才需要進行記憶體管理的本質原因 引用計數器 4位元組 引用計數器常見操作 dealloc 野指標 vs.空指標 記憶體管理原則 set方法的記憶體管理 void setsomething something something dealloc...

7記憶體管理 MRC

記憶體管理,即記憶體裡各個物件的管理,即記憶體裡各個物件的生命週期的管理,從物件導向的角度看 預設為1,即有一滴的生命血液,若為0就會死去 自己管理自己,自己在方法最後,要給自己release一下,不然自己死不了 1重寫遺書方法 在裡面把屬性物件釋放,2重寫set方法,裡面若前後值不同,就釋放舊值,...

iOS開發之oc(十一) 記憶體管理MRC

掌握內容 理解記憶體管理的原理 1.理解部分 1點選工程 build settings 通過gar關鍵字的搜尋搜出automatic re.cou.將此選項的設定改稱no 1.2.2析構函式 可以用來驗證物件是否被釋放 語法 void dealloc void setdog dog dog void...