開啓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); }