IOS ARC 與 JAVA 垃圾回收,

相同:多線程

1,最後結果都是 釋放不須要的空間,函數

不一樣:工具

assign(weak):直接賦值atom

retain(strong):+1,引用一次 調用一次 retainspa

release:-1線程

copy:兩個變量不共享內存,各有各的內存對象

atomic:原子操做(多線程時使用)內存

nonatomic:非原子操做字符串

@autorelease pool:維護一個引用池編譯器

a.先創建一個autorelease pool
b.對象從這個autorelease pool裏面生成。
c.對象生成 以後調用autorelease函數,這個函數的做用僅僅是在autorelease pool中作個標記,讓pool記得未來release一下這個對象。
d.程序結束時,pool自己也須要rerlease, 此時pool會把每個標記爲autorelease的對象release一次。若是某個對象此時retain count大於1,這個對象仍是沒有被銷燬
上面這個例子應該這樣寫:
ClassName *myName = [[[ClassName alloc] init] autorelease];//標記爲autorelease
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,不然release pool時會release這個retain count爲0的對象,這是不對的。

記住一點:若是這個對象是你alloc或者new出來的,你就須要調用release。若是使用autorelease,那麼僅在發生過retain的時候release一次(讓retain count始終爲1)。

ARC:

1,是編譯時候 ,插入到代碼當中,release,retain,

2,管理範圍大小不一樣,ARC 對 C代碼,對core foundation代碼 沒有管轄的權利

3,當咱們在Core Foundation的C函數和Foundation Kit的Objective-C方法間傳遞對象時,經常須要進行id和void*兩個類型的互轉。若是使用ARC,必須在CF對象進入和脫離ARC的控制時,用提示/限定符來告知編譯器。限定符有__bridge、__bridge_retain和__bridge_transfer。另外,仍須要用CFRetain和CFRelease來管理Core Foundation的對象。

JAVA:

1,是運行時候,也跑着專門一個清理的工具,當引用爲0的時候就釋放空間。還有一種是 圖的遍歷,可達不可達,

2,對全部的對象 都進行管理

綜上:能夠理解爲 ARC是 垃圾回收的一部分   ps:歡迎討論交流,

補充:

Java的內存分配上,主要分4個塊!
一塊是用來裝代碼的,就是編譯的東西。
一塊是用來裝靜態變量的,例如用static關鍵字的變量,例如字符串常量。
一塊是stack,也就是棧,是用來裝變量和引用類型的!但區別在於,裝了變量之後,變量上是有值的,而引用類型自己在stack上是沒有值的。
一塊是heap,也就是堆!堆能夠一句話歸納,裝new出來的東西!

綜上:基本數據類型都在stack中,而引用類型,變量是放在stack中,真正有內容的東西放在heap中,也就是當new了一個新的引用類型,他就會放在堆中,同時棧中的引用類型變量會指向堆中你new出來的東西!
相關文章
相關標籤/搜索