@property和@synthesize關鍵字
@property和@synthesize關鍵字可以幫助我們構造屬性的設定和訪問方法即setter和getter方法,可以省去我們很多重複機械的**。
在宣告檔案中使用 @property 宣告變數,在實現檔案中用@synthesize
@property 關鍵字可以自動生成某個成員變數的setter和getter方法的宣告
@property int age;
編譯時遇到這一行,則自動擴充套件成下面兩句:
- (void)setage:(int)age;
- (int)age;
@synthesize關鍵字幫助生成成員變數的setter和getter方法的實現。
@synthesize age=_age;
相當於下面的**:
-(void)setage:(int)age
-(int)age
在新的版本裡面@synthesize被拋棄不用了,只要在宣告檔案裡面使用@property宣告了變數,那麼在實現檔案中就不需要用@synthesize了,也能夠生成屬性的getter和setter方法的實現。
@property關鍵字的引數介紹
1.控制set方法的記憶體管理
retain : release舊值,retain新值(用於oc物件)
assign : 直接賦值,不做任何記憶體管理(預設,用於非oc物件型別)
copy : release舊值,copy新值(一般用於nsstring *)注:物件進行深拷貝,原來的物件進行release操作
2.控制需不需生成set方法
readwrite :同時生成set方法和get方法(預設)
readonly :只會生成get方法
3.多執行緒管理
atomic:效能低(預設)
nonatomic :效能高(一般會使用此引數)
4.控制set方法和get方法的名稱
setter : 設定set方法的名稱,一定有個冒號:
getter : 設定get方法的名稱
不同型別的引數可以同時使用,同型別的只能使用乙個
宣告property的語法為:@property (引數1,引數2) 型別 名字
@property (nonatomic,retain) person *p;
計數器的引入每個oc物件都有自己的引用計數器,是乙個整數,表示「物件被引用的次數」,即有多少人正在使用這個oc物件
每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器
物件的結構圖:
計數器的作用
當使用alloc、new或者copy建立乙個新物件時,新物件的引用計數器預設就是1
當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。換句話說,如果物件的計數器不為0,那麼在整個程式執行過程,它占用的記憶體就不可能被**,除非整個程式已經退出
計數器的操作
給物件傳送一條retain訊息,可以使引用計數器值+1(retain方法返回物件本身)
給物件傳送一條release訊息,可以使引用計數器值-1
可以給物件傳送retaincount訊息獲得當前的引用計數器值
物件的銷毀
當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**
當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息
一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像物件的遺言
一旦重寫了dealloc方法,就必須呼叫[super dealloc],並且放在最後面呼叫
不要直接呼叫dealloc方法
一旦物件被**了,它占用的記憶體就不再可用,堅持使用會導致程式崩潰(野指標錯誤)
記憶體管理法則
誰建立,誰release
如果你通過alloc、new或[mutable]copy來建立乙個物件,那麼你必須呼叫release或autorelease
換句話說,不是你建立的,就不用你去[auto]release
誰retain,誰release
只要你呼叫了retain,無論這個物件是如何生成的,你都要呼叫release
方法的記憶體管理
- (void)setbook:(book *)book
}
2.dealloc方法的實現
- (void)dealloc
若在成員變數宣告的時候使用了retain引數就不需要寫setter方法了。
例如:
@property (nonatomic,retain) book *book;
迴圈引用
當a、b類相互引用時,會佔據著物件讓兩個物件都無法得到釋放。而且直接兩個標頭檔案中相互包含編譯器會報錯的。
在標頭檔案裡面使用@class 來宣告a、b是類,在實現檔案裡面用到了哪個就匯入其標頭檔案。
解決記憶體佔據不釋放的方法:@property關鍵字一段用retain 另外一端用 assign
autoreleasepool 和autorelease
autoreleasepool
自動釋放池,管理池子中的物件
autorelease
給物件傳送autorelease訊息時,會將物件存入autoreleasepool,當系統執行完自動釋放池時,自動釋放池會自動清空池子裡邊的物件
【注】自動釋放池類似於乙個陣列,進行延遲釋放,不會馬上計數器減一,而是將當前物件放入最近的自動釋放池中,當釋放池釋放的時候將池中每乙個元素都釋放一次
自動釋放池有著諸多的限制,記憶體開銷過大的不宜使用,但它的存在讓我們可以不用怎麼太過於注意物件的release時間。
person *p = [[[person alloc] init] autorelease];
黑馬程式設計師 OC 記憶體管理
1.什麼是記憶體管理 管理範圍 任何繼承了nsobject的物件,對其他基本型別無效 2.物件的基本結構 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少個人正在使用oc物件 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器 3.引用計數器的作用 當使用all...
黑馬程式設計師 oc加強學習(記憶體管理)
記憶體管理的原則 1 如果物件有人在使用,那麼就不應該 如果你想使用這個物件,就應該讓這個物件retain一次。如果你不想用這個物件了,就應該讓這個物件release一次。2 誰建立 誰release 哪個物件建立了空間,那個物件就release 3 誰retain 誰release 哪個物件的空間...
黑馬程式設計師學習筆記 OC之記憶體管理 2
黑馬程式設計師學習筆記 oc記憶體管理2 1 迴圈引用 對於迴圈依賴關係來說,比方a類引用b類,同時b類也引用a類這種 編譯會報錯。2 class 當使用 class在兩個類相互宣告,就不會出現編譯報錯,使用 class 類名 就可以引用乙個類,說明一下它是乙個類。3 和 import 的區別1 i...