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;
11.5 block的使用
void (^myblock)(); // block的聲明
- (void)myMethod:(void (^)())block; // 某方法調用block
=================
當 A函數(方法)把一個block作為參數,傳遞給B函數(方法),在A函數(方法)中調用B函數(方法) 時:
作為參數傳遞的block裡邊可以出現(A函數的)形參。
相當于A函數不光傳遞了一個block,還傳遞了傳遞了一堆形參給B函數。
例子:李明傑/iOS開發進階視訊教程/23-再次重構.mp4/00:10:30
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> 定義在原來類中的分類,隻要求能看懂文法
13.private和protected
在類A中把一個成員變量_age聲明為private,則:
在A中的方法:
可以直接通路_age,例如:self->_age
在它的子類B的方法中:
不能直接通路_age,必須使用子類中的get和set方法來通路它。
在類A中把一個成員變量_age聲明為protected,則:
在A的方法中:
當然可以直接通路_age
在B中的方法:
可以通路A的執行個體對象a中的_age,也可以通路B的_age 14.縮進
在XCODE中無法使用TAB鍵對多行代碼進行縮進。想多行縮進,選中需要縮進的代碼使用快捷鍵command(花鍵)+] 即可右縮進,同理,左縮進隻需要command(花鍵)+[ 即可,也可以通過editor->structure下的 Shift Right 和 Shift Lift 指令(4.3.2版本)來進行縮進。
...
轉載于:https://www.cnblogs.com/forzhaokang/p/4668588.html