Objective-C(7)記憶體管理之MRC

來源:互聯網
上載者:User

標籤:objective-c   xcode   ios   類   對象   物件導向   

  • Objective-C記憶體管理

管理範疇: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

總結:有始有終,有加有減。


  • MRC中的代碼規範

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的記憶體管理參數

@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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.