分類和記憶體管理

2022-09-17 06:15:13 字數 3037 閱讀 1062

一.分類的作用:在不改變原來類內容的基礎上,可以為類增加一些方法

使用注意:

1)分類只能增加方法,不能增加成員變數

2)分類方法實現中可以訪問原來類中宣告的成員變數

3)同名方法,分類的優先順序最高(方法重構,覆蓋原類中方法)

4)方法呼叫優先順序:分類—>原類—>父類(後編譯的會覆蓋先編譯的(.**件不編譯))

二.sel:

1)把方法包裝成sel型別的資料

2)根據sel資料找到對應的方法位址

3)根據方法位址呼叫對應的方法

4)每個方法都有乙個與之對應的sel型別的物件

例:[p performselect:@selector(test:) withobject:@「@123」];

[p test3:@「123」];

sel型別建立:

sel s = @selector(test3:);

nsstring *name = @「test2」;

sel s = nsselectorfromstring(name);

[p performselector:s];

每個方法中都有乙個sel型別的_cmd變數,代表當前方法。

nsstring *str = nsstrigfromslelector(_cmd);  //列印方法名

其實訊息就是sel

三.記憶體管理

1)記憶體管理的範圍:任何繼承了nsobject的物件,對其他基本資料型別(int,char,。。。)無效

2)變數記憶體:**塊結束時,(棧空間)區域性變數銷毀(c語言自動**(檢測作用域)),(堆空間動態分配)但物件不回消失,需要手動釋放(傳送訊息)

3)引用計數器:每個物件都有自己的引用計數器,是乙個整數,表示「物件被引用打次數」,即有多少人正在使用這個oc物件(用4個位元組來儲存引用計數器的值)

4)引用計數器操作:

給物件傳送retain訊息,計數器+1(熱態呢方法返回物件本身)

給物件傳送release訊息,計數器-1

可以給物件傳送retaincount訊息獲得當前的引用計數器值

5)物件的銷毀:

一般會重寫dealloc方法來釋放相關資源

dealloc就像物件的遺言(當乙個物件被**時呼叫)(一定呼叫[super dealloc],放在最後面)

6)野指標:指向殭屍物件(所呼叫記憶體已經被**到物件,殭屍物件不能再使用)的指標(指向不可用記憶體)如果繼續訪問記憶體會出現壞訪問錯誤:exc_bad_access(物件死不能復生)

7)@property生成的set方法是直接賦值,沒有管記憶體,@property (retain) book *book 自動向set方法新增retain

8)set方法記憶體管理相關引數

1.*retain:release舊值,retain新值(適用於oc物件型別)

*assign:直接賦值(預設,適用於非oc物件型別)

*copy:release舊值,copy新值

2.是否生成set方法

*readwrite:同時生產setter和getter的申明,實現

*readonly:只會生成getter的宣告,實現

@property (readwrite, assign) int heightj;

3.oc物件型別:

4.非oc物件型別:

9)多執行緒管理

*nonatomic:效能高

*atomic:效能低(預設)

10)setter和getter方法的名稱

*setter:決定了set方法的名稱,一定要有個冒號:

*getter:決定了get方法的名稱(一般用在bool型別get方法)

11)當兩個類需要互相包含時,不能用在.h中用#import,需要雙方都使用@class 類名(告訴編譯器這是乙個類),可以在.m檔案中使用#import來包含介面

12)當出現兩端迴圈引用解決方案時一端用retain,一端用assign

13)自動釋放池:(延遲了物件的釋放時間)

呼叫autorelease方法後,物件的計數器不變

autorelease方法返回物件本身,將物件放到乙個自動釋放池(建立多層池子之後,按棧方式儲存)中,當自動釋放池被銷毀時,會對池子裡面的所有物件做一次release操作,建立方式有大括號方式和

1.不用在關心物件的釋放時間

2.不用再關心什麼時候呼叫release

3.占用記憶體較大的物件不要隨便使用autorelease

注意:release和autorelease只能使用其中乙個,不能多次使用 autorelease 

有時使用類方法快速返回乙個autorelease物件,建立物件時不要直接使用類名,一般使用self

+(id)person{

系統自帶的方法裡面沒有包含alloc,new,copy,說明返回的物件都是autorelease的

14)arc的判斷準則:只要沒有強指標指向物件,就會釋放物件

指標分兩種:

強指標:預設情況下,所有的指標都是強指標

弱指標:__weak

特點:1.不允許呼叫release,retain,retaincount

2.允許重寫dealloc,但不允許呼叫[supper dealloc]

3.@property的引數

*strong:成員變數是強指標(適用於oc物件型別)

*weak:成員變數是弱指標(適用於oc物件型別)

*assign:適用於非oc物件型別ying

如果出現迴圈引用則乙個用__weak另乙個用 __strong

4.以前的retain 改為用strong

如果檔案以前不支援arc,需要臨時支援arc,需要更改compile sources中的檔案操作:

-f-objc-arc  支援arc

-fno-objc-arc 不支援arc

15)協議

協議只用來申明方法

@protorcol myprotocol

-(void)test;

-(void)test;

16)block

1)用來儲存一段**

2)block的標誌:^

例子:

記憶體管理分類

在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在c 程式中,把記憶體分為4 類,程式儲存區 靜態資料儲存...

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

記憶體分布和記憶體管理

一 程序虛擬記憶體分布 名稱儲存內容 棧區域性變數,函式引數,返回位址等 堆動態分配的記憶體 bss段 未初始化或初值為0的全域性變數和靜態區域性變數 資料段已初始化且初值非0的全域性變數和靜態區域性變數 段可執行 字串字面值,唯讀變數 核心空間 堆疊 持續地重用棧空間有助於使活躍的棧記憶體保持在c...