天天看點

【iOS】我的Objective-C學習筆記

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