記錄一下之前的學習內容
viewcontroller.m中
//棧 是高位址往低走 堆是低位址往高走 ,
//(堆疊溢位 堆和棧 被分配到記憶體區域的兩邊 分別往中間儲存,存滿碰頭就會溢位)
//這是乙個方法: oc方法的本質 c函式 == 函式呼叫棧
- (void)viewdidload
[self viewdidload];//會導致程式崩潰 ,記憶體不夠
person * p = [[person alloc]init];
[p eat];
[p eatwithobjc:@"hanbao"];
objc_msgsend(p, @selector(eatwithobjc:),@"hanbao"); //這句等於[p eatwithobjc:@"hanbao"];
}
oc方法由哪幾個部分組成:
sel:方法編號; 類似目錄的名稱
imp(implementation)方法實現 是指標(函式指標) 類似目錄省略號後的頁碼 頁碼指向的內容就是指標指向的位址
oc的方法呼叫其實是 訊息傳送
oc的方法呼叫其實是 呼叫c的函式
person.h
@inte***ce person : nsobject
- (void)eat;
- (void)eatwithobjc:(nsstring *)objc;
@end
#import "person.h"
#import @implementation person
//-(void)eat
//+ (bool)resolveinstancemethod:(sel)sel
//乙個函式
//void eat()
//有引數時
//前面兩個是隱式引數
//oc方法呼叫會傳遞兩個隱式引數
void eat(id self,sel _cmd,nsstring * objc)
@end
2.nil nil null 和nsnull 的區別
雖然工作上除了nil,其它的幾乎少有用到,
一、nil
我們給物件賦值時一般會使用object = nil,表示我想把這個物件釋放掉;
或者物件由於某種原因,經過多次release,於是物件引用計數器為0了,系統將這塊記憶體釋放掉,這個時候這個物件為nil,我稱它為「空物件」。
二、nsnull
nsnull和nil的區別在於,nil是乙個空物件,已經完全從記憶體中消失了,而如果我們想表達「我們需要有這樣乙個容器,但這個容器裡什麼也沒有」的觀念時,我們就用到nsnull,我稱它為「值為空的物件」。如果你查閱開發文件你會發現nsnull這個類是繼承nsobject,並且只有乙個「+ (nsnull *) null;」類方法。這就說明nsnull物件擁有乙個有效的記憶體位址,所以在程式中對它的任何引用都是不會導致程式崩潰的。
三、nil
nil和nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用nil來代替,反之亦然。只不過從程式設計人員的規約中我們約定俗成地將nil表示乙個空物件,nil表示乙個空類。參考**如下:
四、null
我們知道object-c**於c、支援於c,當然也有別於c。而null就是典型c語言的語法,它表示乙個空指標,參考**如下:
int *ponit = null;
runtime詳解
舉例runtime的乙個應用 鏈結裡也有
viewcontroller.m
#import "viewcontroller.h"
#import "nsurl+hook.h"
#import "person.h"
@inte***ce viewcontroller (
)@property
(nonatomic,strong)person *p;
@end
@implementation viewcontroller-(
void
)viewdidload -(
void
)observevalueforkeypath:
(nsstring *
)keypath ofobject:
(id)object change:
(nsdictionary
*)change context:
(void
*)context-(
void
)touchesbegan:
(nsset>
*)touches withevent:
(uievent *
)event
@end
person.h
@inte***ce person : nsobject
//屬性 = 成員變數 + setter + getter 方法
@property
(nonatomic,copy)nsstring *name;
@end
nskvonotyfing_person.m 繼承自person
#import "nskvonotyfing_person.h"
@implementation nskvonotyfing_person-(
void
)setname:
(nsstring *
)name
@end
nsurl+hook
category
#import "nsurl+hook.h"
#import
@implementation nsurl (hook)
//urlstring裡帶中文的時候 返回的url為空 但oc沒判斷
//第一種處理方式
//+ (instancetype)hk_urlwithstring:(nsstring *)urlstring
//// return url;
//}//第二種:利用runtime 改變方法呼叫的順序!(d方法欺騙)+(
void
)load);
}//在 objective-c 的執行時中,每個類有兩個方法都會自動呼叫。+load 是在乙個類被初始裝載時呼叫,+initialize 是在應用第一次呼叫該類的類方法或例項方法前呼叫的。兩個方法都是可選的,並且只有在方法被實現的情況下才會被呼叫。
+(instancetype)hk_urlwithstring:
(nsstring *
)urlstring
return url;
}
iOS runtime 執行時 二 深談
attention!逆天的來了 我們在程式設計過程中,如果使用到了runtime 執行時 我們幾乎都是想動態的改變這個類的資訊,包括方法,屬性,balabala的,並且獲得這個類的一些資訊,等等,下面我們就來看看怎麼通過runtime提供的方法,來達到這些目的 1 獲取 這個類的所有屬性 h 檔案 ...
iOS runtime 執行時 三 深談
引入 import nsobject object nsobject alloc init nsstring str runtime新增的變數 新增 屬性 objc setassociatedobject object,fyobjprokey,str,objc association copy 獲取...
ios Runtime 執行時機制
1.runtime 叫做執行時機制,其實oc也有執行時機制 訊息機制!我們oc中呼叫方法的時候,其實底層就是發訊息。2.c語言中,函式的呼叫在編譯的時候會決定呼叫哪個函式。3.oc當中的函式,屬於動態呼叫的過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在執行的時候才會決定呼叫函式。那麼,現在就可...