計數器:每當物件被建立的時候,物件就會擁有乙個計數器,計數器預設值是1,當計數器的值為0的時候,物件就會被系統收回。
方法的基本使用:
1.retain :計數器+1,回返回物件本身
2.release :計數器-1,沒有返回值
3.retaincount :返回當前計數器的值
4.dealoc : 當乙個物件被收回的時候就會呼叫,一定要呼叫[super dealloc]方法,這句話在最後面
例如:
#import #import "person.h"
int main()
當計數器為0被**,p物件已被**,接著對p物件使用retain方法就會發生錯誤:
-[person retain]: message sent to deallocated instance 0x100205990,即給以**的物件傳送訊息
#import #import "person.h"
int main()
p物件被**後就是乙個殭屍物件,不可在用
概念:殭屍物件:所占用記憶體已被**的物件,不可在使用
野指標:指向殭屍物件(不可用記憶體)的指標,給野指標傳送訊息就會報錯(exc_bad_access )
空指標:沒有指向任何東西的指標,或儲存的東西是nil、null、0,給空指標傳送訊息不會報錯
多個物件之間記憶體管理
假如,有乙個人,擁有有本書,有人、書兩個物件
person類的.m文 件**
#import "person.h"
@implementation person
- (void)setbook:(book *)book
- (book *)book
// 物件被收回時呼叫
- (void)dealloc
@end
main函式
#import #import "person.h"
int main()
總結;
1.你想使用那個物件,就應該讓哪個物件的計數器+1(即執行retain操作)
2你不想使用那個物件,就應該讓那個物件的計數器-1(即執行release操作)
3.誰retain,誰release
4.誰alloc,誰release
假如乙個人擁有多本書,看完一本又買一本
int main()
結果是12沒有被**,是因為在p物件的set方法的舊的物件和新的物件的區別,當新的引數物件傳進來時,把舊的物件的計數器retain,而p被**呼叫dealloc函式時,呼叫的時當前物件的release,所以在新的引數物件傳進來前給舊的物件執行release,還可以在set方法中進行一些過濾,保證不會出現操作殭屍物件,更改如下;
#import "person.h"
@implementation person
- (void)setbook:(book *)book
}- (book *)book
// 物件被收回時呼叫
- (void)dealloc
@end
這樣避免了操作殭屍物件
總結:
**規範:只要又alloc就必須要有release,物件不是alloc生成的就不需要release
set方法的**規範:
1.基本資料型別:直接複製
2.oc物件:
*先判斷是不是新傳進來的物件
* 對舊物件執行一次release
* 對新物件執行一次retain
dealloc**的規範:
*一定要有[super dealloc],且放在最後面
*對self所擁有的其他物件執行一次release
以上是對oc記憶體管理的學習總結,還不夠完善,有待補充
Oc 記憶體管理
1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...
OC記憶體管理
1.記憶體管理原則 如果對乙個物件使用了alloc mutable copy retain,那麼你必須使用相應的release或者autorelease。2.管理範圍 任何繼承了nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 ...
OC 記憶體管理
管理範圍 任何繼承nsobject的物件,對其他的基本資料型別無效。判斷物件要不要 的唯一依據就是計數器是否為0,若不為0則存在。所以對記憶體的管理就是對計數器的管理 1 retain 計數器 1,會返回物件本身 2 release 計數器 1 沒有返回值 3 retaincount 獲取當前的計數...