真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Objective-C(7)內(nèi)存管理之MRC-創(chuàng)新互聯(lián)

  • 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)用場景需求。


當(dāng)前標(biāo)題:Objective-C(7)內(nèi)存管理之MRC-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://weahome.cn/article/dppped.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部