標籤:
1.代碼中增加標記
#pragma mark -
#pragma mark
2.點文法
Person *p = [Person new];
// 點文法的本質還是方法調用
p.age = 10; // [p setAge:10];
int a = p.age; // [p age];
3.成員變數的範圍
@public : 在任何地方都能直接存取對象的成員變數
@private : 只能在當前類的對象方法中直接存取(@implementation中預設是@private)
@protected : 可以在當前類及其子類的對象方法中直接存取 (@interface中預設就是@protected)
@package : 只要處在同一個架構中,就能直接存取對象的成員變數
@interface和@implementation中不能聲明同名的成員變數
4.構造方法
構造方法:用來初始化對象的方法,是個對象方法,-開頭
重寫構造方法的目的:為了讓對象建立出來,成員變數就會有一些固定的值
重寫構造方法的注意點:
1.先調用父類的構造方法([super init])
2.再進行子類內部成員變數的初始化
5.Category-分類
分類的作用:在不改變原來類內容的基礎上,可以為類增加一些方法
使用注意:
1.分類只能增加方法,不能增加成員變數
2.分類方法實現中可以訪問原來類中聲明的成員變數
3.分類可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,會導致原來的方法沒法再使用
4.方法調用的優先順序:分類(最後參與編譯的分類優先) --> 原來類 --> 父類
6.Category-分類的load和initialize
1.當程式啟動時,就會附加元件目中所有的類和分類,而且載入後會調用每個類和分類的+load方法。只會調用一次。
2.當第一次使用某個類時,就會調用當前類的+initialize方法
3.先載入父類,再載入子類(先調用父類的+load方法,再調用子類的+load方法)
先初始化父類,再初始化子類(先調用父類的+initialize方法,再調用子類的+initialize方法)
7.利用NSLog和%@輸出對象
預設情況下,利用NSLog和%@輸出對象時,結果是:<類名:記憶體位址>
1.會調用對象p的-description方法
2.拿到-description方法的傳回值(NSString *)顯示到螢幕上
3.-description方法預設返回的是“類名+記憶體位址”
8.SEL
SEL其實是對方法的一種封裝,將方法封裝成一個SEL類型的資料,去找對應的方法地址。找到方法地址就可以調用方法
其實訊息就是SEL
SEL s = @selector(test2:);
[p performSelector:s withObject:@"456"];
[p test2];
1.把test2封裝成SEL類型的資料
2.根據SEL資料找到對應的方法地址
3.根據方法地址調用對應的方法
9.ARC
ARC的判斷準則:只要沒有強指標指向對象,就會釋放對象
1.ARC特點
1> 不允許調用release、retain、retainCount
2> 允許重寫dealloc,但是不允許調用[super dealloc]
3> @property的參數:
strong :成員變數是強指標(適用於OC物件類型)
weak :成員變數是弱指標(適用於OC物件類型)
assign : 適用於非OC物件類型
4> 以前的retain改為用strong
指標分2種:
1> 強指標:預設情況下,所有的指標都是強指標 __strong
2> 弱指標:__weak
10.循環參考
當兩端循環參考的時候,解決方案:
1> ARC
1端用strong,另1端用weak
2> 非ARC
1端用retain,另1端用assign
11.block
block要掌握的東西
1> 如何定義block變數
int (^sumBlock)(int, int);
void (^myBlock)();
2> 如何利用block封裝代碼
^(int a, int b) {
return a - b;
};
3> block訪問外面變數
* block內部可以訪問外面的變數
* 預設情況下,block內部不能修改外面的局部變數
* 給局部變數加上__block關鍵字,這個局部變數就可以在block內部修改
4> 利用typedef定義block類型
typedef int (^MyBlock)(int, int);
// 以後就可以利用MyBlock這種類型來定義block變數
MyBlock block;
MyBlock b1, b2;
12.protocol 協議
1.協議的定義
@protocol 協議名稱 <NSObject>
// 方法聲明列表....
@end
2.如何遵守協議
1> 類遵守協議
@interface 類名 : 父類名 <協議名稱1, 協議名稱2>
@end
2> 協議遵守協議
@protocol 協議名稱 <其他協議名稱1, 其他協議名稱2>
@end
3.協議中方法聲明的關鍵字
1> @required (預設)
要求實現,如果沒有實現,會發出警告
2> @optional
不要求實現,怎樣不會有警告
4.定義一個變數的時候,限制這個變數儲存的對象遵守某個協議
類名<協議名稱> *變數名;
id<協議名稱> 變數名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果沒有遵守對應的協議,編譯器會警告
[email protected]中聲明的屬性也可用做一個遵守協議的限制
@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> 定義在原來類中的分類,只要求能看懂文法
我的Objective-C學習筆記