一.分類的作用:在不改變原來類內容的基礎上,可以為類增加一些方法
使用注意:
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...