天天看點

Object-C加強 記憶體管理

1 . 基本方法使用

1> retain : 計數器 + 1 , 會傳回對象本身

2> release : 計數器 - 1 , 沒有傳回值

3> retainCount : 擷取目前的計數器

4> dealloc

    * 當一個對象要背回收的時候, 就會調用

    * 一定要調用[super dealloc] , 這句調用要放在最後面

2.概念

 1>僵屍對象 : 所占用記憶體已經被回收的對象, 僵屍對象不能再使用

 2>野指針 : 指向僵屍對象 (不可用記憶體) 的指針

 3>空指針 : 沒有指向任何東西的指針(存儲的東西是nil, NULL , 0 ) , 給空指針發送消息不會報錯

注意:

1 . 想使用(占用) 某個對象 , 就應該讓對象的計數器+1 (retain操作)

 2 . 不想使用(占用) 某個對象 , 就讓對象的計數器 -1 (release操作)

 3 . 誰 retain , 誰 release

 4 . 誰 release , 誰 release

記憶體管理代理規範

 1.隻要調用alloc , 必須有 release (autorelease)

 2.set方法的代碼規範

 1>基本資料類型 :直接複制

 -(void)setAge:(int)age

 {

 _age = age;

 }

 2> OC對象類型

 - (void)setCar:(Car*)car

 {

     // 1. 先判斷是不是新傳進來的對象

     if( car != _car)

     {

         // 2. 對舊對象做一次release

         [ _carrelease ];     // 第一次調用為 nil

         // 3. 對新對象做一次retain

         _car = [carretain];

     }

 }

 3 . dealloc 方法的代碼規範

 1> 一定要調用[super dealloc] , 而且要放到最後面

 2> 對self(目前對象) 所擁有的其他對象做一次release

 - (void)dealloc

 {

        [ _carrelease];

        [ superdealloc];

 }

   ARC automaticReference Counting 自動引用計數

   ARC 編譯器特性

       編譯器會在适當時候,加入記憶體管理的代碼

   強指針:預設所有的指針都是強指針

          隻要是有強指針指向一個對象,那麼這個對象就不會被釋放

          隻要是沒有強指針指向一個對象,那麼這個對象就被立即回收

          __strong 強指針标示,但是預設所有指針都是強指針,是以他沒有用

   弱指針:弱指針指向的對象不影響對象回收

   注意:不要用弱指針指向一個剛剛建立出來的對象

   當出現循環引用的時候,必須要由一端是弱指針

----------------------------------------------------------------------------

案例 :

#import <Foundation/Foundation.h>

#import "CZPerson.h"

/*

   如果記憶體管理不當

   1、不再使用對象沒有被回收,記憶體洩露,最終導緻程式閃退

   2、正在被使用對象被釋放了,野指針,通路野指針就會導緻程式崩潰

   ARC  Automatic Reference Counting     自動引用計數

   MRC  Manual Reference Counting   手動引用計數

   1、當一個對象剛剛出生時候,它的引用計數 1

   2、當對象上引用計數是0的時候,系統立即把它回收

   3、release  引用計數-1

   4、retain   引用計數+1

int main(int argc, const char * argv[]) {

    CZPerson *person =[[CZPerson alloc] init];//1

    long count  = [person retainCount];

    NSLog(@"%zd",count);

    [person retain];//2

    NSLog(@"%zd",[personretainCount]);

    [person release];//0

    NSLog(@"%zd",[personretainCount]);

    [person release];

//    person = nil;

//  當一個指針指向 nil,這個指針我稱為空指針

//  給空指針發送消息系統不會報錯,它什麼都不做

    [person test];

    [person dealloc];

    NSLog(@"%zd",[personretainCount]);//

    return 0;

}

#import <Foundation/Foundation.h>

@interface CZPerson : NSObject

- (void) test;

@end

@implementation CZPerson

- (void) test

{

    NSLog(@"CZPerson");

}

//永遠不要試圖自己調用這個方法

-(void) dealloc

{

//   這裡可以驗證對象是否被回收了

    NSLog(@"CZPerson回收");

//  這個方法中必須調用父類該方法,并且必須放在最後

    [super dealloc];

}

@end

繼續閱讀