IOS學習---OC基礎學習(ARC 協議)

ARC機制:
不需要再dealloc中手動添加release操作
原理:
只要沒有強指針指向對象,就會釋放對象


指針分兩種:
1、強指針:默認情況下,所有的指針都是強指針__strong(兩個下劃


線)
2、弱指針: __weak Person *p = [[Person alloc] init];
該對象P創建後 立即被釋放 因此這種寫法沒有價值和意義


@property (nonatomic strong) Dog *dog;
//使用ARC之後不用寫retain 改爲strong 基本類型還是assign


ARC特點:
1、不允許調用release、retain、retainCount
2、允許重寫dealloc 但是不允許調用[super dealloc]
3、@property 的參數
   *strong:成員變量爲強指針相當於原來的retain(適用於OC對象


類型)
   *weak:成員變量時弱指針 相當於原來的assign(適用於OC對象


類型)
   *assign:適用於非OC對象類型


項目中多個文件 有的兼容ARC有的不兼容ARC 可能由於有些不支持


ARC 可以講項目中的某個文件改爲ARC
方法:在build setting 中搜索automatic 雙擊 ARC的選項 在彈出


的的的對話框中添加下面代碼:
-fno-bobjc-arc
既可以將ARC轉爲非ARC


ARC的循環引用(人和身份證):
問題:雙方互相引用 互不釋放
未引入ARC的解決方法
.h文件中利用@class引用  .m文件中在import 類.h
將對象中一個保持retain 一個改爲assign


使用ARC的解決方法:
.h文件中利用@class引用  .m文件中在import 類.h
將對象中一個保持strong 一個改爲weak
1、一端用strong 一端用weak




Block類型:
作用:用來保存一端代碼
block的標誌是:^
block跟函數很像
1、可以保存代碼
2、有返回值
3、有形參
4、調用方式相同
block方法:
void (^myblock)(形參) = ^{//如果沒有形參可以省略()
NSLog(@"----------------");
};//有分號
//利用block變量調用block內部的代碼
調用block方法
myblock();


有形參的block:
計算兩個數的和
聲明
int (^sumblock)(int,int)
實現
^(int a,int b){
return a+b;
};
聲明實現一起來:
int (^sumblock)(int,int) = ^(int a,int b){return a+b};
調用:
int c = sumblock(10,11);
此處參考指向函數的指針(C語言)二者有相似之處 
int sum(int a,int b)
{
return a+b;
}


int (*p)(int ,int ) = sum;
調用:int c = p(10,11);


block總結“
1、如何定義block變量
int (^sumblock)(int,int) 
void (^myBlock)();
2、如何利用block封裝代碼
^(int a,int b){
return a-b;
};
^(){
NSLog(@"---------");
};
^{
NSLog(@"----------");
};


3、block訪問外部變量
1、block內部可以直接訪問外部變量
2、默認情況下,block不可以修改外部變量
3、局部變量加上__block(兩個下劃線)關鍵字,這個局部變量就可以


在block中進行修改


4、利用typedef定義block類型
typedef int (^MyBlock)(int,int);
//以後就可以利用MyBlock這種類型來定義block
MyBlock block;
MyBlock b1,b2;


b1 = ^(int a,int b){
returna - b;
};


MyBlock b3 = ^(int a,int b){
return a-b;
};




@protocol(協議)的使用:
用途:
1、可以聲明方法(不能聲明成員變量)
2、只要某個類遵守這個協議,就相當於擁有這個協議中的所有方法


聲明(在.h文件中#import “協議名稱”)
3、只要父類遵守了某個協議,就相當於子類也遵守了


格式:
協議的編寫
@protocol 協議名稱
//方法聲明列表
@end


某各類遵守協議
@interface 類名 :父類<協議名稱,協議名稱>
@end;


@protocol中的方法也可以選擇性的實現
例如:
@protocol MyProtocol


//@required要求實現,不實現就會發出警告 默認爲required
//@optional 不要求實現(可以不實現)


- (void)test4;
@required
- (void)test;
- (void)test2
@optional
- (void)test3;


@end;


@required、optional 主要用於程序員之間的交流


協議遵守協議:
1、一個協議可以遵守其他多個協議,多個協議之間用逗號隔開
2、一個協議遵守了其他協議,就相當於擁有了其他協議中的方法聲


明
@protocol 協議名稱 <協議1,協議2>
@end;


基協議:
NSObjce是一個基類,最根本最基本的類,任何其他類最終都要繼承


他
其實還有一個協議,名字也叫NSObject,他是一個基協議,最根本最


基本的協議
NSObjcet協議中聲明分舵最基本的方法比如description、retain、


release等
建議每個新的協議都要遵守NSObject協議


協議的總結:
1、協議的定義
@protocol 協議名稱 <NSObjcet>
//方法聲明列表
@end;


2、如何遵守協議
  ①類遵守協議
    @interface 類名 : 父類名<協議名稱1,協議名稱2>
    @end;
  ②協議遵守協議
    @protocol 協議名稱 <其他協議名稱1,其他協議名稱2>
    @end;


3、協議中方法聲明的關鍵字
   @required:默認的 要求實現  如果不實現會發出警告但不報錯
   @optional:不要求實現  不會出現警告


4、定義一個變量的時候 限制遵守某個協議
   類名<協議名稱> *變量名;
   id<協議名稱> 變量名;
例如:
   NSObjcet <MyProtocal> *obj;
   id<MyProtocol> obj2;沒有*號


如果沒有遵守對應的協議,編譯器會發出警告


5、@property中聲明的屬性也可以用做一個遵守協議的限制
@property (nonatomic,strong) 類名<協議名稱>*屬性名;
@property (nonatomic,strong) id<協議名稱> 屬性名;


@property (nonatomic,strong) Dog<MyProtocol>*dog;
@property (nonatomic,strong) id<MyProtocol> dog2;


6、協議可以單獨定義在其他文件中(.h),也可以單獨定義某個類


中
1、如果這個協議只用在某個類中,應該把協議定義在某個類中


2、如果這個協議用在很多類中,應該把協議定義在單獨文件中


7、分類可以定義在單獨.h和.m文件中,也可以定義在原來的類中
1、一般情況下,都是定義在單獨文件中
2、定義在原來類中的分類 只要求能看懂語法





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章