MRC(手動內存管理)

Manual Reference Counting(簡寫MRC)多線程


調回手動內存管理要有下面的操做性能

引用計數器的基本操做
atom

 1.方法的基本使用
 1> retain
:計數器+1,會返回對象自己
 2> release
:計數器-1,沒有返回值
 3> retainCount
:獲取當前的計數器
 4> dealloc
  *
當一個對象要被回收的時候,就會調用
  *
必定要調用[super dealloc],這句調用要放在最後面
 
 2.
概念
 1>
殭屍對象 :所佔用內存已經被回收的對象,殭屍對象不能再使用
 2>
野指針 :指向殭屍對象(不可用內存)的指針,給野指針發送消息會報錯(EXC_BAD_ACCESS
 3>
空指針 :沒有指向任何東西的指針(存儲的東西是nilNULL0),給空指針發送消息不會報錯
spa


多對象的內存管理.net

 1.你想使用(佔用)某個對象,就應該讓對象的計數器+1(讓對象作一次retain操做)
 2.
你不想再使用(佔用)某個對象,就應該讓對象的計數器-1(讓對象作一次release
 3.
retain,誰release
 4.
alloc,誰release
線程


set方法的內存管理指針

內存管理代碼規範:
 1.
只要調用了alloc,必須有releaseautorelease
  
對象不是經過alloc產生的,就不須要release
 
 2.set
方法的代碼規範
 1>
基本數據類型:直接複製
 - (void)setAge:(int)age
 {
    _age = age;
 }
 
 2> OC
對象類型
 - (void)setCar:(Car *)car
 {
    // 1.
先判斷是否是新傳進來對象
    if ( car != _car )
    {
        // 2.
對舊對象作一次release
        [_car release];
 
        // 3.
對新對象作一次retain
        _car = [car retain];
    }
 }
 
 3.dealloc
方法的代碼規範
 1>
必定要[super dealloc],並且放到最後面
 2>
self(當前)所擁有的其餘對象作一次release
 - (void)dealloc
 {
    [_car release];
    [super dealloc];
 }

代碼規範


@property參數對象

 1.set方法內存管理相關的參數
 * retain : release
舊值,retain新值(適用於OC對象類型)
 * assign :
直接賦值(默認,適用於非OC對象類型)
 * copy   : release
舊值,copy新值
 
 2.
是否要生成set方法
 * readwrite :
同時生成settergetter的聲明、實現(默認)
 * readonly  :
只會生成getter的聲明、實現
 
 3.
多線程管理
 * nonatomic :
性能高 (通常就用這個)
 * atomic    :
性能低(默認)
 
 4.setter
getter方法的名稱
 * setter :
決定了set方法的名稱,必定要有個冒號 :
 * getter :
決定了get方法的名稱(通常用在BOOL類型)
內存


循環引用及@class

 1.@class 的做用:僅僅告訴編譯器,某個名稱是一個類
 @class Person; //
僅僅告訴編譯器,Person是一個類
 
 2.
開發中引用一個類的規範
 1>
.h文件中用@class 來聲明類
 2>
.m文件中用#import來包含類的全部東西
 
 3.
兩端循環引用解決方案
 1>
一端用retain
 2>
一端用assign


autorelease

 1.autorelease的基本用法
 1>
會將對象放到一個自動釋放池中
 2>
當自動釋放池被銷燬時,會對池子裏面的全部對象作一次release操做
 3>
會返回對象自己
 4>
調用完autorelease方法後,對象的計數器不變
 
 2.autorelease
的好處
 1>
不用再關心對象釋放的時間
 2>
不用再關心何時調用release
 
 3.autorelease
的使用注意
 1>
佔用內存較大的對象不要隨便使用autorelease
 2>
佔用內存較小的對象使用autorelease,沒有太大影響


 6.自動釋放池的建立方式
 1> iOS 5.0

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
 [pool release]; // [pool drain];
 
 
 2> iOS 5.0
開始
 @autoreleasepool
 {
   
 }


 1.官方內存管理原則
 1>
當調用allocnewcopymutableCopy)方法產生一個新對象的時候,就必須在最後調用一次release或者autorelease
 2>
當調用retain方法讓對象的計數器+1,就必須在最後調用一次release或者autorelease
 
 2.
集合的內存管理細節
 1>
當把一個對象添加到集合中時,這個對象會作了一次retain操做,計數器會+1
 2>
當一個集合被銷燬時,會對集合裏面的全部對象作一次release操做,計數器會-1
 3>
當一個對象從集合中移除時,這個對象會一次release操做,計數器會-1
 
 3.
廣泛規律
 1>
若是方法名是add\insert開頭,那麼被添加的對象,計數器會+1
 2>
若是方法名是remove\delete開頭,那麼被移除的對象,計數器-1

相關文章
相關標籤/搜索