相同:多線程
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出來的東西!