IOS內存管理

開啓Xcode野指針調試功能:
1.點擊左上角Stop按鈕邊上的項目名稱
2.Edit Scheme
3.Diagnostics
4.勾選Objective—C的Enable Zoombie Objects


內存管理原則:
1.只要調用了alloc、new建立了一個新對象,那麼就作一個relese
2.只要調用了retain,那麼就作一次release
3.不能操做已經釋放的對象,不讓會發生也指針錯誤
4.在對象被釋放以前,才能操做對象
5.計數器有加就有減
6.哪裏alloc、new,哪裏release
7.set方法的內存管理(設置的是對象)
    release舊對象
    retain新對象
    - (void)setHouse:(House *)house{
        if (house != _house) {
            //扔掉舊房子
            [_house release];
            //對新房子作一次retain
            _house = [house retain];
        }
    }
    - (void)setCar:(Car *)c2
    {
    if (c2 != _car)
    {
        // release舊車
        [_car release];
        // retain新車
        _car = [c2 retain];
    }
    }

    - (Car *)car
    {
        return _car;
    }
    
    - (void)dealloc
    {
        [_car release];
        [_house release];
        NSLog(@"Person被銷燬了!!!");
        
        [super dealloc];
    }
8.dealloc方法的內存管理
    釋放當前擁有的全部對象
    
9.@property的參數
    1、控制set方法的內存管理:
    1.retain:release舊值,retain新值
    2.assign:直接賦值,不作任何內存管理(默認)
    3.copy
    
    2、控制有沒有set方法和get方法
    1.readwrite : 同時生成set和get方法(默認,少用)
    2.readonly  : 只會生成get方法
    
    3、多線程管理
    1.atomic    : 性能低(默認)
    2.nonatomic : 性能高

    4、控制set方法和get方法的名稱
    1.setter : 設置set方法的名稱,必定有個冒號:
    2.getter : 設置get方法的名稱

10.蘋果官方提供的方法(API):
 1)若是方法名不是alloc、new,就不用release或者autorelease
 2)若是方法名是alloc、new,就必須release或者autorelease


協議:(能夠遵照多個協議)
<>遵照某個協議,只要遵照了這個協議,至關於擁有協議裏面的全部方法聲明
編譯器不強求實現協議裏全部的方法
    協議的應用--代理模式
    代理的類型爲id
    
-----------------------------    
block:
 1.定義block變量:
 返回值類型 (^block變量名) (參數類型1, 參數類型2, ....);
 
 
 2.給block變量賦值
 block變量名 = ^(參數類型1 參數名稱1, .....)
 {
    
 };
 

void test();
void test2();

// MyBlock其實就是新的數據類型名稱
typedef int (^MyBlock)(int, int);



int main(int argc, const char * argv[])
{
    test();
    MyBlock minus = ^(int a, int b)
    {
        return a - b;
    };
    int d = minus(10,5);
    NSLog(@"d id %d", d); 
    
    
    MyBlock sum = ^(int v1, int v2)
    {
        return v1 + v2;
    };
    
    int e = sum(10, 11); 
    NSLog(@"e is %d", e);
    
    
    /*
    int (^minusBlock) (int, int) = ^(int a, int b){
        return a - b;
    };
    minusBlock(10, 5);
    
    
    int (^averageBlock) (int, int) = ^(int a, int b)
    {
        return (a+ b)/2;
    };*/
    
    
    return 0;
}

void test()
{
    int a = 10;
    __block int b = 10;
    
    //block內部不能修改默認是局部變量
    //定義一個block變量
    void (^block)() = ^{
        b = 11;
        NSLog(%@"b=%d",b);
    };
    block();
}

void test()
{
    //左邊的viod:block沒有返回值
    //右邊的():沒有參數
    //中間的(^)block的標準,不能少
    void (^myblock)() = ^{
        int a = 11;
        int b = 13;
        NSLog(@"a=%d, b=%d",a,b);
    };
    myblock();
    
    
    //定義一個block變量,變量名是sumBlock
    //最左邊的int:block的返回值是int類型
    //最右邊的(int, int)  block接受連個int類型的參數
    int (^sumBlock)(int,int);
    sumBlock = ^(int v1, int v2) {
        return v1 + v2;
    };
    int sum = sumBlock(10,11);
    NSLog(%@"sum=%d",sum);
}
    

 
相關文章
相關標籤/搜索