bjec內存管理採用引用計數的方式。當你使用new,alloc或copy建立對象時,對象的引用計數由0自增到1,調用release方法以後對象的引用計數減一,當且僅當對象的引用計數爲0的時候dealloc方法將被自動調用,因此,咱們應該儘可能避免手動調用dealloc方法。由於可能代碼的其餘地方還存在對該對象的引用,調用dealloc方法將該對象釋放以後可能會形成對該對象的非法引用而致使程序崩潰。 多線程
如下是有關objc對象的內存管理的一些API: 框架
1,alloc, allocWithZone,new(帶初始化)爲對象分配內存,retainCount爲「1」,並返回此類的一個實例對象。 函數
2,release retainCount 減「1」,減到「0」時將自動調用此對象的dealloc方法。
atom
3,retain retainCount 加「1」 spa
4,copy,mutableCopy 複製一個實例,retainCount數爲「1」,返回此實例。所獲得的對象是與其它上下文無關的,獨立的對象(乾淨對象)。 線程
5,autorelease 在當前上下文的AutoreleasePool棧頂的autoreleasePool實例添加此對象,因爲它的引入使Objective-C(非GC管理環境)由全手動內存管理上升到半自動化。
指針
(1)、assign是直接賦值。不會涉及引用計數問題,主要用於對objc基礎數據類型(NSInteger、CGFloat等)和C基本數據類型(int 、double、float、char等)的賦值. 對象
(2)、retain是指針拷貝,使用了引用計數,對對象進行retain操做以後將使對象的引用計數+1,增長了一個對原對象的引用。 繼承
(3)、copy是值拷貝,對對象進行copy操做以後至關於給原對象作了一份拷貝。新對象的值將和原對象相同,可是新對象和員對象各自有本身的內存地址,即,新對象的內存地址不一樣於原對象,因此,copy不會使員對象的引用計數遞增。可是新對象的引用計數將遞增爲1,至關於建立了一個與原對象相同的新的對象。 生命週期
(4)、atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。加了atomic,setter函數會變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
nonatomic屬性表示禁止多線程,當某個對象不須要在多個線程中訪問時該屬性能夠有效地提升效率,節省資源。
注意:retain不能用於基本數據類型,由於基本數據類型沒有引用計數。copy屬性只對實行了NSCopying協議的對象類型有效。當數據爲int, float等原生類型時,可使用assign。
這兩個方法都會使對象的引用計數減一,不一樣之處在於,當release/autorelease操做使對象的引用計數爲0的時候,若是執行的release,則將會當即調用dealloc釋放掉該對象。相反若是用的使autorelease,該對象不會當即被釋放,而是將該對象放到自動回收池中,當最近的一個pool被釋放以後,該對象纔會被執行dealloc釋放。
總結:
1. 當你使用new,alloc或copy建立對象時,對象的count retain到1。你必定要負責把這個對象release 或 autolease掉。這樣當它的生命週期結束時,它才能清空。
2. 當你使用 其餘方法得到一個對象時,你能夠認爲它已經retain了一個count,而且autolease掉了。你不用考慮和它相關的清理問題 。可是若是你想保留這個對象,那麼你須要retain它,而且要確保以後你release了這個對象。
3. 若是你retain一個對象,你最終老是須要release或者autolease它。
這三條規則在寫代碼 的時候必定要遵照,一旦遵照了通常也就不會有內存泄露的問題。
Cocoa是Mac OS和iPhone OS上的開發框架,使用Objective-C作爲開發語言。固然,在代碼中也能夠嵌入C和C++的語句。在Cocoa框架中,全部的控件、窗口等都繼承自 UIView,對應MVC中的 V。UIView及其子類主要負責UI的實現,而UIView所產生的事件均可以採用委託的方式,交給UIViewController實現。對於不一樣的UIView,都有相應的UIViewController 對應MVC中的C。好比在iPhone OS上經常使用的UITableView,它所對應的Controller就是UITableViewController。至於MVC中的M,那須要根據用戶本身的需求來實現了。