我的Objective-C學習筆記

來源:互聯網
上載者:User

標籤:

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學習筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.