標籤:oc記憶體管理 對象所有權
引用計數
每個對象都有一個與之相關聯多整數,被稱作它的引用計數器或保留計算機,當某段代碼需要訪問一個對象時,該代碼就將該對象的保留計數器值加1,表示我要訪問該對象,當這段代碼訪問結束的時候,將對象的保留計數器數值減1,表示不再訪問該對象了。當保留計數器的值為0時,表示不再有代碼訪問該對象了,此時它將被銷毀同時佔用的記憶體被回收。
對象的保留計數器值初始值為1。當一個對象即將要被銷毀的時候,OC會向對象發送一條dealloc訊息,這條訊息可以在自己的對象中重寫。
常見的幾種調用方法:
-(id) retain;
-(oneway void) release;
-(NSUInteger) retainCount;
Eg:
#import <Foundation/Foundation.h>
@interface RetainTra : NSObject
@end
@implementation RetainTra
-(id) init
{
if (self = [super init]) {
NSLog(@"init : This is first call -- %d .",[self retainCount]);
}
return (self);
}
-(void) dealloc
{
NSLog(@"dealloc called . Bye Bye..");
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
RetainTra *tracker = [ RetainTra new]; //count:1 此處直接調用了init
[tracker retain];//count 2
NSLog(@"%d--1",[tracker retainCount]);
[tracker retain];//count 3
NSLog(@"%d--2",[tracker retainCount]);
[tracker release]; //count 2
NSLog(@"%d--3",[tracker retainCount]);
[tracker release]; //count 1
NSLog(@"%d--4",[tracker retainCount]);
[tracker release]; //count 0 調用了dealloc。。
//NSLog(@"%d--5",[tracker retainCount]);
return 0;
}
對象所有權
如果一個對象內有指向其他對象的執行個體變數,則稱該對象擁有這些對象。如。car對象擁有其指向的engine和tire對象。同樣,如果一個函數建立了一個對象,則稱該函數擁有這個對象。
存取方法中的保留和釋放
一個更好的解決對象釋放問題的代碼
-(void) setEngine :(Engine *) newEngine
{
[newEngine retain];
[engine release];
engine = newEngine;
}//setEngine
首先保留了新的engine對象,即使newEngine與engine是同一個對象,保留計數器的值也將先增加,然後立即減少。由於沒有歸0,engine對象意外的未被銷毀,這樣避免了錯誤發生。
在存取方法中,如果先保留新對象,然後再釋放對象就不會出現問題了。
自動釋放
不知道為什麼,看到這個詞的時候,前面一直緊張的內心忽然平靜了下來。。。
今天在看引用計數和對象所有權上花了很多時間,加上老師講了很多關於函數的基礎概念,需要慢慢記憶的東西很多。
Objective-C學習筆記 記憶體管理