黑馬程式設計師-----OC記憶體管理(二)
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