@一、範圍:
任何繼承了
nsobject
的物件,對基本資料型別無效。
@二、原理:
1.每個物件內部都儲存乙個與之相關聯的整數,稱為引用計數器
2.當使用
alloc
、new
或者copy
建立乙個物件的時候,物件引用計數器被設定為1
3.給物件傳送一條
retain
訊息,可以使引用計數器值+1
4.給物件傳送一條
release
訊息,可以使引用計數器值-1
5.當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**,oc也會自動向物件傳送一條
dealloc
訊息。一般會重寫
dealloc
方法,在這裡釋放相關資源。一定不要直接呼叫
dealloc
方法。
6.可以給物件傳送
retaincount
訊息活得當前的引用計數器值。
@三、管理規則:
1.誰建立,誰釋放(誰汙染,誰治理)。如果你通過
alloc
,new
或(mutable)
或copy
來建立乙個物件的話,那麼你必須呼叫
release
或者autorelease
。換句話說,不是你建立的你就不用釋放。
2.一般來說,除了
alloc
,new
,或者copy
之外的方法建立的物件都被宣告了
autorelease。
3.誰retain
,誰release
。只要你呼叫了
retain
,無論這個物件啊是如何生成的,你都要呼叫release。
@四、示例
@inte***ce student : nsobject
@property int age;
@end
上面是student類的宣告部分.h檔案,下面是實現部分.m檔案
@implementation student
@synthesize age = _age; // 在xcode4.5環境下可以省略
- (void)dealloc
@end
我們寫乙個測試方法來說明記憶體引用計數的變化
student *stu = [[student alloc] init]; // 1 // z代表無符號
nslog(@"count:%zi", [stu retaincount]);
[stu retain]; // 2
nslog(@"count:%zi", [stu retaincount]);
[stu release]; // 1
nslog(@"count:%zi", [stu retaincount]);
[stu release]; // 0
// [stu release]; // 會發生野指標錯誤,也就是說訪問了不屬於你的記憶體
再寫乙個示例說明:
// student物件的計數器永遠為1,所以不可能被釋放
[[student alloc] init].age = 10;
[student new].age = 10;
// 上面的**都有記憶體洩露
@五、物件之間的記憶體管理
物件之間的記憶體管理是經常見到的情況,我們來模擬一下學生(student)和書(book)之間的記憶體管理。首先student類宣告和實現部分如下:
@inte***ce student : nsobject
@property int age;
- (id)initwithage:(int)age;
@property book *book;
- (void)readbook;
@implementation student
#pragma mark - 生命週期方法
#pragma mark 構造方法
- (id)initwithage:(int)age
return self;
}#pragma mark **物件
- (void)dealloc
#pragma mark - getter和setter
// @synthesize book = _book;
// 如果自己手動實現了getter和setter,xcode就不會自動生成@synthesize
// 也就不會自動生成_book
// getter和setter的預設實現
- (void)setbook:(book *)book
}- (book *)book
#pragma mark - 公共方法
#pragma mark 讀書
- (void)readbook
//#pragma mark - 私有方法
//#pragma mark 私有方法1
//- (void)test1 {}
//#pragma mark 私有方法2
//- (void)test2 {}
//#pragma mark 私有方法3
//- (void)test3 {}
@end
book類的宣告和實現部分如下:@inte***ce book : nsobject
@property float price; // **
- (id)initwithprice:(float)price;
@end
@implementation book
- (id)initwithprice:(float)price
return self;
}- (void)dealloc
@end
下面在main方法中對記憶體管理進行測試分析,示例如下:
void test(student *stu)
void test1(student *stu)
int main(int argc, const char * argv)
return 0;
}
通過分析,加深對記憶體管理的了解。熟記口訣,牢記原則。 oc學習之旅 記憶體管理
因為以前的 都是使用非arc 手動管理 而arc還不太完善,因此學習非arc模式還是有必要的。在用非arc模式 引用計數器概念 oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain 對應arc中的strong 另一種是弱引用assign...
IOS學習 OC記憶體管理
記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...
OC 記憶體管理 記憶體5大區域
棧區域 系統自動分配.儲存區域性變數 如 int num 10,int p num。num 與 p 都儲存在棧區域 堆區域 允許程式設計師手動的從堆申請空間來使用,要主動釋放。除非程式結束 如 int 4,float 4 malloc,calloc bss段區域 儲存未初始化的全域性變數 靜態變數,...