1. 程式人生 > >黑馬程式設計師-----OC記憶體管理(二)

黑馬程式設計師-----OC記憶體管理(二)

---------------------- ASP.Net+Unity開發.Net培訓、期待與您交流! ----------------------

OC記憶體管理
1>記憶體管理原則
①只要還有人在用某個物件,那麼這個物件就不會被回收;只要想用這個物件,就讓計數器+1;檔不想使用這個物件,就讓物件的計數器-1。
②如果你通過alloc,new或者[mutable]copy來建立一個物件,那麼你就必須呼叫release或者autorelease,如果不是你建立的,你就不需要去[auto]release。
③只要你掉用了retain,無論這個物件是怎麼產生的,你都要呼叫release。
2>記憶體管理例項
//Book.h
@interface Book : NSObject
{
 int _price;
}

- (void)setPrice:(int)price;
- (int)price;
@end

//Book.m
@implementation  Book
- (void)setPrice:(int)price
{
 _price = price;
}
- (int)price
{
 return _price;
}
//重寫dealloc
- (void)dealloc
{
 NSlog(@"Book被回收");
 [super dealloc];
}
@end


//Person.h

@class Book;
@interface Person : NSObject
{
 Book *_book;
}
- (void)setBook:(Book *)book;
- (Book *)book;
@end

//Person.m
@implementation
- (void)setBook:(Book *)book
{
 //我們的Person為了擁有一個book那麼,就需要(讓book的計數器+1)retain;
 if(_book != book)
 {
  [_book release];
  _book = [book retain];
 }
}
- (Book *)book
{
 return _book;
}
//重寫dealloc方法
- (void)dealloc
{
 //在遺言之前,必須對所有的你擁有的物件release,這裡只有_book。
 [_book release];
 [super dealloc];
}
@end

//main.m
int main()
{
 //計數器b為1,p為1
 Book *b = [[Book alloc] init];
 Person *p = [[Person alloc] init];
 
 //計數器b為2,p為1
 //p想佔用b這本書,就需要retain,放在setter方法中
 [p setBook:b];
 //計數器b為1,p為1
 [b release];
 b = nil;
 
 //計數器b為0,p為0
 [p release];
 p = nil; 

 return 0;
}
3>setter方法的記憶體管理
①setter方法實現
- (void)setBook:(Book *)book{
 if (book != _book) {
  [_book release];
  _book = [book retain];
 }
}
②@property的記憶體管理
//自動生成setter方法管理記憶體,會先release舊值,retain新值
@property (nonatomic, retain) Book *book;
//重寫dealloc方法
方法同上。

4>小零碎
①有加就有減,曾經讓物件計數器+1,就必須在最後讓計數器-1。
②在dealloc當中必須將物件當中擁有的物件進行release,而且因為OC不存在空指標錯誤即[nil release]沒有錯的,那麼我們可以在dealloc中對所有的物件成員呼叫一次release方法。
③setter方法先release舊指,再retain新指。
④在需要進行記憶體管理的,必須使用@property (retain)(或者手動實現setter方法)和重寫dealloc方法。
⑤@property常用引數:retain,assign,copy,readonly,readwrite
⑥BOOL型別的變數getter方法名以is開頭eg:isRich

---------------------- ASP.Net+Unity開發.Net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com

相關推薦

no