• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            兔子的技術(shù)博客

            兔子

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

            留言簿(10)

            最新評論

            閱讀排行榜

            評論排行榜

            最近稍微學(xué)習(xí)了一點 Objective-C ,做筆記和做編碼練習(xí)都是鞏固學(xué)習(xí)的好方法。整理記錄腦子里的新知識有助于理清思路,發(fā)現(xiàn)知識盲點以及錯誤的理解。

            Objective-C 和 C++ 同樣從兼容 C 語言開始,以給 C 語言增加面向?qū)ο鬄槌踔?,他們的出現(xiàn)的時間都很類似(1983 年左右)。但面向?qū)ο缶幊痰脑搭^卻不同:C++ 受 Simula 和 Ada 的影響比較多,而 Objective-C 的相關(guān)思想源至 Smalltalk ,最終的結(jié)果是他們在對象模型上有不小的差異。

            以我這些天粗淺的了解,Objective-C 似乎比 C++ 更強調(diào)類型的動態(tài)性,而犧牲了一些執(zhí)行性能。不過這些犧牲,由于模型清晰,可以在今天,由更先進的編譯技術(shù)來彌補了。

            我對 C++ 的認知比 Objective-C 要多的多,所以對 C++ 開發(fā)中會遇到的問題的了解也多的多。在學(xué)習(xí) Objective-C 的過程中,我發(fā)現(xiàn)很多地方都可以填上曾經(jīng)在 C++ 開發(fā)中遇到的問題。當然,Objective-C 一定也有它自己的坑,只是我才剛開始,沒有踩到過罷了。


            ObjC 的類方法調(diào)用的形式,更接近于向?qū)ο蟀l(fā)送消息。語法寫作:

            [obj message]

            如果方法帶有參數(shù),那么就寫作

            [obj param:value]

            方法和名稱和參數(shù)的名稱是一體的,參數(shù)決定了方法是什么。如果有多個參數(shù),那么寫作:

            [obj param1:value1 param2:value2]

            注意,如果一個類有兩個方法,一個有一個參數(shù),一個有兩個參數(shù)。即使兩個參數(shù)的版本中有一個參數(shù)名稱和單個參數(shù)版本的相同,它們也是兩個不同的方法。ObjC 不支持默認參數(shù)的語法。

            C++ 調(diào)用對象的方法就更接近于 C 的函數(shù)調(diào)用。兩相比較,可以發(fā)現(xiàn) ObjC 的語法讓代碼可讀性更強。你可以很容易的理解參數(shù)的用途,也不怕方法參數(shù)過多時,一串參數(shù)寫漏或?qū)戝e次序了。


            和 C++ 一樣,ObjC 的類聲明和實現(xiàn)是分離的。但做的比 C++ 更徹底。ObjC 不能在聲明的代碼段中寫 inline 函數(shù)。這看起來犧牲了一些運行性能,但當實現(xiàn)部分更好的分離。作為補充,ObjC 有 @property ,可以幫助程序員簡化實現(xiàn),也可以讓編譯器生成更好的代碼。

            聲明一個類寫成這樣:

            @interface class : baseclass {    type a; }  - (void) method;  - (void) messge: (type) param;  + (id) create ;  @end 

            ObjC 利用了 C 語言中沒有使用的符號 @ 來擴展 C 的語法,而不是用 C++ 里增加關(guān)鍵字的方式。這或許是一個對語言擴展更簡單的做法,而不用考慮兼容性。C++ 就得精心挑選新增加的關(guān)鍵字,盡量回避那些已有代碼中高頻出現(xiàn)的單詞。

            類的數(shù)據(jù)段和方法是分離的。數(shù)據(jù)描述放在 {} 中,方法寫在其后,在 @end 之前。

            "-" 開頭的方法是實例方法,也就是 C++ 中的成員方法。成員方法中可以通過 self 取到實例指針,也就是 C++ 中的 this 指針。

            同樣,ObjC 也支持類方法,也就是 C++ 中的 static 成員方法。通常是用來構(gòu)造實例。聲明方法是在方法名前寫一個 + 號。

            和 C++ 不同,ObjC 是有類對象的。類對象里有超類指針、類名、類方法列表指針,還有類對象的字節(jié)大小等元信息。而 C++ 中是用 RTTI 類實現(xiàn)不完全的類似功能的。

            調(diào)用類方法和調(diào)用實例方法在語法上沒有什么不同。類名就是類對象的名字。

            ObjC 不支持多繼承,沒有私有、公開這些修飾符。

            ObjC 的類方法實現(xiàn)必須寫在同一個源文件里。不像 C++ 有 :: 操作符,ObjC 在實現(xiàn)方法時不寫類的名字,而是把所有實現(xiàn)都寫在 @implementation class ... @end 之間。訪問基類,也可以方便的使用 super 關(guān)鍵字。

            那么,如果一個類的方法太多,不適合寫在同一個源文件中怎么辦?


            ObjC 提供了 category 這個概念。

            可以通過 category 為一個類添加一些方法。category 和繼承是不同的,不能為類添加新的成員變量,所以它不會改變類對象的內(nèi)存布局。添加了方法的類還是原來那個類。

            category 的語法是這樣的:

            @interface class (category)   - newmethod;  @end 

            這樣,就給 class 類添加了一個方法 newmethod ,并歸類在 category 下。

            和 C++ 不同,ObjC 的方法更具動態(tài)性。你可以在運行時任意調(diào)用一個對象的方法,而不用管它是否存在。ObjC 支持 id 這個類型。 id 其實就是對象指針,任何類型的對象都可以被 id 引用,并可以方便的向其發(fā)送消息(方法調(diào)用)。如果方法不存在,會拋出運行時錯誤。

            向一個指定類型發(fā)送一個不存在的消息,會得到一個編譯期警告,而不是編譯錯誤。當然,我們不能隨便忽略編譯期警告,如果我們清楚的知道運行期這個對象可以處理這個消息,那么可以給類加一個 category 但不必實現(xiàn)它。這樣,編譯器就能了解新的方法了。

            利用 category 可以方便的一個龐大的類拆分成獨立的模塊。在 C++ 中,比較接近的概念是 friend ,不過 friend 不易被優(yōu)雅的使用。

            既然方法可以被運行期檢查,那么方法本身在 ObjC 中也可以被當成一種類型來處理。比較接近的 C++ 中的概念是 成員方法指針。回顧學(xué)習(xí) C++ 的經(jīng)歷就能回憶起當年使用 ::* 或是 ->* 的頭痛經(jīng)歷。ObjC 中的方法可以運行期綁定, @selector(method:) 的語法也簡單的多。

            在 NSObject 中就提供了一個叫 respondsToSelector: 的方法,接受一個 selector 用來檢查自己是否可以接受這個消息。


            ObjC 也提供了類似 Java 的 interface 或是 C++ 的純虛類的東西,在 ObjC 中被稱為 @protocol 。

            @protocol 可以看成是一種沒有數(shù)據(jù)成員的虛類。一個實際的類可以聲明自己實現(xiàn)了某些協(xié)議,語法是

            @interface class : base <protocol> {    // variables }  // methods @end 

            和繼承不同,一個類可以聲明多個協(xié)議。然后在 @implementation 中必須一一實現(xiàn)它們。

            如上所述,ObjC 已經(jīng)做到了運行期的方法綁定,所以 @protocol 只是做了更嚴格的編譯檢查。在新版的 ObjC 2.0 中,追加了 @optional 和 @required 用來描述那些方法的實現(xiàn)是可選的,哪些必須實現(xiàn)。


            ObjC 的基礎(chǔ)庫比 C++ 更完整,標準化要好的多,也和語言結(jié)合的更緊密。

            比如 NSString 是一個基礎(chǔ)類,用于處理字符串。同時,語言也提供 @"string" 的語法方便的生成 NSString 對象。

            ObjC 保留了 C 中的 printf 式的字符串操作形式,對比 C++ 重載移位操作符的形式,我想要更清爽一些。

            對于 ObjC 對象,使用 %@ 來表示。給對象增加 description 方法就可以讓處理函數(shù)知道該如何處理這個對象的 %@ 行為。

            轉(zhuǎn)自:http://blog.codingnow.com/2013/03/objective_c.html#more
            posted on 2013-04-02 14:46 會飛的兔子 閱讀(322) 評論(0)  編輯 收藏 引用 所屬分類: 蘋果相關(guān)
            久久久精品午夜免费不卡| 久久99久国产麻精品66| 久久久久久久尹人综合网亚洲| 天堂久久天堂AV色综合| 国产精品久久久久影院嫩草| 爱做久久久久久| 无码国内精品久久人妻| 国产毛片久久久久久国产毛片| 久久久国产精华液| 国产成人久久精品区一区二区| 欧美日韩精品久久久久| 久久精品成人免费看| 久久人人爽人人人人爽AV| 国产成人久久久精品二区三区| 伊人色综合久久天天网| 国产国产成人久久精品| 麻豆一区二区99久久久久| 久久综合九色综合欧美就去吻| 久久不射电影网| 久久婷婷成人综合色综合| 久久精品国产清自在天天线| 久久综合狠狠综合久久激情 | 久久久久亚洲国产| 99久久亚洲综合精品网站| 精品久久久久久无码专区不卡| 一本一本久久a久久精品综合麻豆| 久久久久四虎国产精品| 97久久香蕉国产线看观看| 一本久道久久综合狠狠爱| 久久精品桃花综合| 色婷婷噜噜久久国产精品12p| 精品久久久久久久| 国产成人无码久久久精品一| 亚洲午夜久久久影院伊人| 久久AV无码精品人妻糸列| 亚洲午夜久久久久妓女影院| 久久无码AV一区二区三区| 精品多毛少妇人妻AV免费久久| 久久无码AV一区二区三区| 亚洲精品tv久久久久久久久| 亚洲AV无一区二区三区久久|