Objective-C內(nèi)存管理
站在用戶的角度思考問題,與客戶深入溝通,找到元寶網(wǎng)站設(shè)計與元寶網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋元寶地區(qū)。管理范疇:OC對象
每個計算機(jī)系統(tǒng)可供程序使用的內(nèi)存資源是有限的。我們要關(guān)心兩件事情:
在需要時分配,用完之后釋放
不要使用任何已被釋放的內(nèi)存資源,否則將無用陳舊的值導(dǎo)致各種各樣的錯誤發(fā)生
三種管理方式:
手動管理方式 MRC(Manual referencing count)
半自動管理方式 autoreleasepool
自動管理方式 ARC(Auto referencing count)
引用計數(shù)與內(nèi)存管理準(zhǔn)則
Cocoa采用了一種稱為“引用計數(shù)”的技術(shù),它為每個對象關(guān)聯(lián)一個整數(shù):
相關(guān)方法:
- (instancetype)retain //引用計數(shù)+1 - (void)release //引用計數(shù)-1 - (NSUInteger)retainCount //對象的當(dāng)前引用計數(shù)值
使用引用計數(shù):
a. 當(dāng)創(chuàng)建一個對象時(alloc new copy),被創(chuàng)建對象的引用計數(shù)為1
b. 當(dāng)某段代碼要訪問這個對象時就對該引用計數(shù)+1 (retain)
c. 當(dāng)這段代碼完成后要對這個引用計數(shù)-1 (release)
d. 當(dāng)引用計數(shù)為0時,表示沒有代碼訪問這個對象了,該對象就會被銷毀
(銷毀前自動向其發(fā)送一個dealloc消息)。
場景解釋:游戲中的房間、副本等
內(nèi)存管理的準(zhǔn)則:
1)內(nèi)存管理的原則:
只要還有人在使用某個對象,那么這個對象就不會被回收;
只要你想使用這個對象,那么就應(yīng)該讓這個對象的引用計數(shù)器+1;
當(dāng)你不想使用這個對象時,應(yīng)該讓對象的引用計數(shù)器-1;
2)誰創(chuàng)建,誰release
a. 如果你通過alloc,new,copy來創(chuàng)建了一個對象,那么你就必須調(diào)用release或者autorelease方法
b. 不是你創(chuàng)建的就不用你去負(fù)責(zé)
3)誰retain,誰release
總結(jié):有始有終,有加有減。
MRC中的代碼規(guī)范
1)只要調(diào)用了alloc,就必須有release
2)屬性的setter方法
a. 基本數(shù)據(jù)類型直接賦值
- (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)不要出現(xiàn)以下垃圾代碼
stu.car = [[Car alloc] init]; //會使引用計數(shù)為2 [[Car alloc] init].speed = 100; //無法釋放了
@property的內(nèi)存管理參數(shù)
@property應(yīng)有且僅有一個內(nèi)存管理參數(shù)。
MRC下,內(nèi)存管理參數(shù)包括:assign retain copy,默認(rèn)為assign
這些內(nèi)存管理參數(shù),能夠決定屬性setter方法的實現(xiàn)
assign:setter不修改引用計數(shù)
@property (nonatomic,assign) NSInteger age;
setter方法:
- (void)setAge:(NSInteger)age { _age = age; }
retain:修改該屬性的引用計數(shù)(按照代碼規(guī)范)
@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]; }
對象復(fù)合關(guān)系出現(xiàn)的循環(huán)引用問題
問題描述:
一個Person對象,一個Card對象,互為屬性
如果一個內(nèi)存參數(shù)均為retain,則應(yīng)會使引用計數(shù)均為2
這樣做對任意對象release,都不會使對象銷毀
解決方法:
一端使用retain,一端使用assign
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。