標籤:objective-c xcode ios 類 對象 物件導向
管理範疇:OC對象
每個電腦系統可供程式使用的記憶體資源是有限的。我們要關心兩件事情:
在需要時分配,用完之後釋放
不要使用任何已被釋放的記憶體資源,否則將無用陳舊的值導致各種各樣的錯誤發生
三種管理方式:
手動管理方式 MRC(Manual referencing count)
半自動管理方式 autoreleasepool
自動管理方式 ARC(Auto referencing count)
Cocoa採用了一種稱為“引用計數”的技術,它為每個對象關聯一個整數:
相關方法:
- (instancetype)retain //引用計數+1- (void)release //引用計數-1- (NSUInteger)retainCount //對象的當前引用計數值
使用引用計數:
a. 當建立一個對象時(alloc new copy),被建立對象的引用計數為1
b. 當某段代碼要訪問這個對象時就對該引用計數+1 (retain)
c. 當這段程式碼完成後要對這個引用計數-1 (release)
d. 當引用計數為0時,表示沒有代碼訪問這個對象了,該對象就會被銷毀
(銷毀前自動向其發送一個dealloc訊息)。
情境解釋:遊戲中的房間、副本等
記憶體管理的準則:
1)記憶體管理的原則:
只要還有人在使用某個對象,那麼這個對象就不會被回收;
只要你想使用這個對象,那麼就應該讓這個對象的引用計數器+1;
當你不想使用這個對象時,應該讓對象的引用計數器-1;
2)誰建立,誰release
a. 如果你通過alloc,new,copy來建立了一個對象,那麼你就必須調用release或者autorelease方法
b. 不是你建立的就不用你去負責
3)誰retain,誰release
總結:有始有終,有加有減。
1)只要調用了alloc,就必須有release
2)屬性的setter方法
a. 基礎資料型別 (Elementary Data Type)直接賦值
- (void) setAge:(int) age { _age = age;}
b. OC對象,先判斷和屬性舊值的是不是同一對象
如果是,則什麼也不做;如果不是,將舊值release,並對新值retain
- (void) setCar:(Car *) car { if ( car != _car ) { [ _car release]; _car = [ car retain]; }}
3)dealloc方法
a. 對self所持有的屬性release一次
b. [super dealloc]放在最後
- (void) dealloc { [car release]; [super dealloc];}
4)不要出現以下垃圾代碼
stu.car = [[Car alloc] init]; //會使引用計數為2[[Car alloc] init].speed = 100; //無法釋放了
@property應有且僅有一個記憶體管理參數。
MRC下,記憶體管理參數包括:assign retain copy,預設為assign
這些記憶體管理參數,能夠決定屬性setter方法的實現
assign:setter不修改引用計數
@property (nonatomic,assign) NSInteger age;
setter方法:
- (void)setAge:(NSInteger)age { _age = age;}
retain:修改該屬性的引用計數(按照代碼規範)
@property (nonatomic, retain) NSNumber * age;
setter方法:
- (void)setAge:(NSNumber *)age { if ( _age != age ) { [_age release]; _age = [age retain]; }}
copy:深拷貝賦值,一般用於NSString
@property (nonatomic, copy) NSString * name;
setter方法:
- (void)setName:(NSString *)name { if ( _name != nil ) { [_name release]; } _name = [name copy];}
對象複合關係出現的循環參考問題
問題描述:
一個Person對象,一個Card對象,互為屬性
如果一個記憶體參數均為retain,則應會使引用計數均為2
這樣做對任意對象release,都不會使對象銷毀
解決方案:
一端使用retain,一端使用assign
本文出自 “teacherAn” 部落格,請務必保留此出處http://annmeng.blog.51cto.com/3321237/1745688
Objective-C(7)記憶體管理之MRC