1、類方法是屬于整個類,而不屬于某個對象。2、類方法只能訪問類成員變量,不能訪問實(shí)例變量,而實(shí)例方法可以訪問類成員變量和實(shí)例變量。3、類方法的調(diào)用可以通過類名.類方法和對象.類方法,而實(shí)例方法只能通過對象.實(shí)例方法訪問。4、類方法只能訪問類方法,而實(shí)例方法可以訪問類方法和實(shí)例方法。5類方法不能被覆蓋,實(shí)例方法可以被覆蓋。
為羅莊等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及羅莊網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、羅莊網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
1.定義函數(shù)時,希望傳入的參數(shù)不為nil,或者為nil時會有警告顯示:
如下:
- (instanceype)initWithFoo:(NSString *)foo bar:(NSString *)bar sark:(NSString *)sark
__atttribute__((nonnull(1, 2)));
p.s. index從1開始,不是0,且只對對象生效。
該技巧同樣來自,sunnyxx大神的微信,逗比狗~
2.定義函數(shù)時,希望子類override該方法時候,必須調(diào)用super,否則編譯器直接報錯。
@interface OldSix:NSObject
- (void)fooWithNothing __attribute__((objc_requires_super));
該技巧同樣來自,sunnyxx大神的微信,逗比狗~
wait~~~~~
/*檢查子類在重寫該方法時有沒有調(diào)用自己(父類)的實(shí)現(xiàn)
*對于一些可以被繼承的類,需要子類在重某一調(diào)用父類的實(shí)現(xiàn)以保證正確的行為,通過在頭文件方法的聲明末尾添加`NS_REQUIRES_SUPER`
*可以讓編譯器檢查子類方法有調(diào)用父類的實(shí)現(xiàn)。具體使用方法如下:
* - (void)viewWillAppear:(BOOL)animated NS_REQUIRES_SUPER;
*/
但是根據(jù)我的實(shí)際測試,發(fā)現(xiàn)sunnyxx大神仙的方法,沒有任何顯示效果,不知道是不是我打開的方式不對還是怎么,
總之,NS_REQUIRES_SUPER的方法親測可用。
3.誤刪系統(tǒng)sdk頭文件的解決辦法
在終端中輸入:
$ cd ~/Library/Developer/Xcode/DerivedData/ModuleCache/
$ rm -rf *
4.ARC下打印retainCount
extern uintptr_t _objc_rootRetainCount(id obj);
id test = [NSString new];
NSLog(@"retain count %lu",_objc_rootRetainCount(test));
5.工程報錯下,仍然可以編譯成功
6.定位方法的調(diào)用者
類方法: 也被稱為靜態(tài)方法,指 static關(guān)鍵字修飾的方法。此類方法屬于類本身的方法,不屬于類的某一個實(shí)例(對象)。在類方法中不可以直接使用實(shí)例變量。其調(diào)用方式有三種,可直接調(diào)用、類名、方法名、對象名。
實(shí)例方法:指的是不用static關(guān)鍵字修飾的方法,每個實(shí)例對象都有自身的實(shí)例方法,互相獨(dú)立,不共享。其調(diào)用方式只能是對象名,方法名。
何時用靜態(tài)方法,何時用類方法?
實(shí)例方法: 當(dāng)你給一個類寫一個方法,如果該方法需要訪問某個實(shí)例的成員變量時,那么方法該被定義為實(shí)例方法。 一個類的實(shí)例通常有一些成員變量,其中含有該實(shí)例的狀態(tài)信息。而該方法需要改變這些狀態(tài),那么該方法需要聲明成實(shí)例方法。
類方法(靜態(tài)方法):它不需要訪問某個實(shí)例的成員變量,不需要改變某個實(shí)例的狀態(tài),我們把該方法定義為靜態(tài)方法。
類方法和實(shí)例方法的誤區(qū):
靜態(tài)方法常駐內(nèi)存,實(shí)例方法不是。所以靜態(tài)方法效率更高,但占內(nèi)存。。(錯誤的)
事實(shí)上,方法都是一樣,在加載時機(jī)和占用內(nèi)存上,靜態(tài)方法和實(shí)例方法是一樣的。在類型第一次被使用時加載,調(diào)用的速度基本沒有差別
靜態(tài)方法在堆上分配內(nèi)存,實(shí)例方法在棧上(錯誤)
事實(shí)上,所有的方法都不可能在堆上或者棧上分配內(nèi)存,方法作為代碼是被分配到特使的代碼內(nèi)存區(qū)域,這個代碼內(nèi)存區(qū)域是不可寫的。
實(shí)例方法需要先創(chuàng)建實(shí)例才可以調(diào)用,比較麻煩,靜態(tài)方法不用,比較簡單。(錯誤)
事實(shí)上,如果一個方法不訪問某實(shí)例成員變量或者不改變實(shí)例狀態(tài),那么就應(yīng)該寫成靜態(tài)方法。
常用實(shí)例和類
第一種方式:聲明實(shí),調(diào)用實(shí)例方法
當(dāng)一個類有多個實(shí)例,例如學(xué)生這個類,實(shí)例可以有學(xué)生甲乙丙丁。etc 我們就用第一種方式,在多線程的情況下,只要每個線程創(chuàng)建自己的實(shí)例,那么第一種方法通常是線程安全的
第二種:通過靜態(tài)的實(shí)例去調(diào)用實(shí)例方法
第一步:編程入門課
時間預(yù)計(jì):4個星期
推薦看公開課,Udacity也行,網(wǎng)易公開課也行,自己找一個面對對象語言(一般是JAVA, C++, Python)的課。我是在網(wǎng)易公開課看的斯坦福的CS106A,學(xué)的JAVA。
如果你純粹學(xué)iOS開發(fā),不推薦看哈佛CS50,CS50是給CS系的學(xué)生介紹整個計(jì)算機(jī)世界的框架,講的內(nèi)容比較多,進(jìn)度比較快,對iOS開發(fā)其實(shí)有點(diǎn)累贅了。(臣妾有點(diǎn)跟不上?。。。?/p>
計(jì)劃安排是一天一課,看課程要求的書(至少看完一本)及大部分作業(yè)。這一階段重點(diǎn)不是語法,而是以下3個目標(biāo)。
目標(biāo):
1. 讓自己對編程這件事感到適應(yīng)。
寫hello world。
怎么寫function, 怎么調(diào)用function。
全局變量,局部變量這類基本知識點(diǎn)。
都是基本的東西??纯磿?,寫多兩個程序就歐啦。
2. 掌握編程語言的基本要素。
編程語言4個要素:
a. 基本的數(shù)據(jù)類型:整數(shù),實(shí)數(shù),character, string, boolean
b. 基本的運(yùn)算符號:+-×/++--那啥的
c. 怎樣輸入輸出
d. 怎樣控制程序:sequence,selection,loop
3. 了解編程范式
面對過程編程。
面向?qū)ο缶幊獭?/p>
第二步:上手iOS!
時間預(yù)計(jì):2星期
強(qiáng)烈推薦CS193P,老頭子講的超級好!我的很多東西(對象思維啥的)是在這里跟著做練習(xí)的時候才真正明白的(好啦,也可能是上一堂課練習(xí)做得少的原因)。如果等到9月應(yīng)該itunes U上會開始教iOS 7了。網(wǎng)易公開課的是2010年iOS 5版的,前10堂課,也行。(iTunes U上有完整的課)
CS193P說有prerequisite,一開始被嚇到,事實(shí)證明還是可以學(xué)下去的。頭兩節(jié)課一頭霧水,沒關(guān)系,把itunes U上的課件下載下來,把所有代碼打出來,然后一個個元素對應(yīng)之前學(xué)的語言匹配,再不懂先放著,繼續(xù)學(xué)后邊的,過幾天打多點(diǎn)代碼就懂了。
感覺學(xué)5、6堂課,一個星期左右就可以開始進(jìn)入下一階段自己做東西了。之后用啥學(xué)啥,每堂課都有主題的。速度慢點(diǎn)的同學(xué)們,這階段跟我一樣準(zhǔn)備兩個星期吧!
第三步:開發(fā)app!
時間預(yù)計(jì):2星期(本人...1個半月,實(shí)在不好意思說出口)
這個時間就可長可短啦,還包括美工,交互啥的。堅(jiān)持要用啥學(xué)啥的原則,其實(shí)就是知道iOS SDK都有什么組件,每個組件有什么function而已。stackoverflow, Github, apple sample code多上,搜索引擎多用。如果有個師傅,這個階段真的是進(jìn)步神速。
好的!不出意外,你的第一個app就這么新鮮出爐了!從今天開始,成為一個冷艷逼格高尚的iOS開發(fā)者吧!
需求如題,如果是你,你一定首先想到看看JavaScriptCore有沒有暴露出對應(yīng)的 delegate 方法可以直接用,抱歉,還真沒有。那該怎么辦?怎么辦?么辦?辦?......
記得之前有一篇關(guān)于 JSBridge 的文章有提到,直接 NSObject 類有一個方法,webView:didCreateJavaScriptContext:forFrame:,從語義上看,應(yīng)該就滿足上面的需求。
好,寫個 NSObject 的分類實(shí)現(xiàn)下看看。
測試很簡單,在 web 頁面的 js 腳本里,調(diào)用 printHello(); 即可。
實(shí)踐證明:好使!
熟悉 runtime 的話,這個很簡單,調(diào)用 class_copyMethodList 把類里所有的方法取出來打印就好。有的時候,為了分析一個需求如何實(shí)現(xiàn),可能要遞歸打印幾個類的方法,從當(dāng)前類,到其父類,到其爺爺類,...直到 NSObject 類。
感謝 oc 語言的創(chuàng)始人和開發(fā)者,每個類的類方法、實(shí)例方法都幾乎可以做到望文生義,才讓大家能有這一快樂!
最后,enjoy yourself!
方法是沒有訪問級別的,跟ObjectiveC跟C(不是C++)是類似的。
C里面定義了方法,但是如果不給出聲明,別人調(diào)用時候是找不到的(雖然自己聲明一個一模一樣的方法也可以)。ObjectiveC也是一樣,所有方法都沒有訪問保護(hù)級別(@property屬性也是方法的一種)
只有一種有訪問級別,就是大括號里面定義的成員變量,里面有public和private,貌似是沒有protected的概念(可能有,但是我完全不用的)。