Object C學習初步

來源:互聯網
上載者:User

標籤:java   使用   os   檔案   資料   io   

    最近乘著項目不太緊張的時候,趕緊給自己沖了一下電。其實我自己最熟悉的平台應該是.net,所以當初上手windows phone的話是很快,我記得當初是一邊跟著項目進展,一邊自己開始學習前台的XAML語言以及頁面的布局,所以一個項目跟下來的話windows phone平台也就差不多了。

    早先就有過學習ios的想法,應該iphone實在是太酷了,感覺開發ios比windows phone更加有成就感。但是前前後後一直在往後延遲,因為ios的同事們一直給我灌輸的思想就是oc語言還有挺難學的,相比較c#,jave實在是相差有點大。好吧!最近幾天就是帶著這種畏懼的思想開始看一些oc入門的書籍,整個看下來的話,其實也沒有傳說中的那麼難嘛!

    好了,不扯遠了,讓我們回到主題上面來吧!本文主要還是想要梳理一下自己學習過程中影響比較深的知識點,如果有什麼不周到的地方歡迎拍磚。

    首先如果你之前沒有oc基礎的話,你初一看oc代碼,你會發現這很是奇怪呀!其實我本人覺得oc最大的特點就是更加的像我們的自然語言。首先在你利用xcode建立一個iphone項目之後,你會發現一個分頁檔(.nib)竟然預設是關聯著兩個檔案的(.h和.m),開始我學的時候我也很好奇這兩個檔案到底是什麼東東呢?我想如果你做過windows phone或者andorid的話,你就會很習慣一個前檯布局頁面,一個後台代碼邏輯處理頁面(當然如果後台邏輯比較複雜的話,你可能需要拆分到不同的類檔案)。好了,不賣關子了,其實.h檔案又稱作是標頭檔,在這個檔案裡面你可以定義需要關聯到前台頁面配置檔案的控制項,比如IBOutLet *UILabel;然後下面你需要提供該控制項的屬性,就跟c#裡面的get,set一樣。只不過在oc裡面預設提供了特性文法,可以快速的實現屬性的定義,當然在這個方法裡面你還可以提供一些方法的簽名。然後與當前該.h檔案重名的.m檔案就是具體的實現處理邏輯的地方。在這個.m檔案裡面,首先我們需要實現.h檔案裡面定義的屬性和方法(注意這些屬性、方法通常是需要關聯到前台的頁面控制項上面的),然後我們就可以在這些方法裡面定義我們自己的處理邏輯了。

   在ios裡面都是採用mvc模式的,所以頁面和處理代碼的脫離就全靠控制器了。比如我們在.h檔案裡面定義了一個按鈕的點擊事件,那麼我怎樣與前台頁面的按鈕關聯起來呢?我們是不是可以像windows phone裡面直接一個Button控制項拖拽到頁面,然後Click事件一訂閱就自動關聯起來了呢?哈哈,在ios裡面你可能需要麻煩一點你先要將UIButton控制項關聯到一個控制器上面,然後再將相應的按鈕事件關聯到控制器(.h檔案)裡面定義的事件上面。

   好了,現在能夠將頁面和代碼處理邏輯關聯起來了,那麼後面我遇到一個比較棘手的問題就是我怎樣能夠將一些重複代碼抽離出來呢?即我怎麼能夠像c#裡面通過定義一些繼承,介面,公用方法實現oop呢?這就涉及到oc裡面的類、結構的定義了,在oc裡面定義這些東東我們需要使用@符號。比如現在我們假設這樣一種情境,我們需要在一個頁面上面畫出一個長方形和一個三角形,比較死板的方法是我們相應.m檔案“啪啪啪”敲兩個方法分別來實現長方形和三角形的繪製工作,好一點的話,我們可能會將兩個方法裡面重複的部分重構到另一個方法裡面(重構的方法還是在該類裡面,而不是另外一個基類裡面)。那麼我們有沒有什麼最有的做法呢?其實只要我們好好想一下這個問題的實現就會知道,它們無非是形狀不同而已。我們完全可以將它們所具有的公用方法抽離到一個shape基類裡面,然後兩個類從中繼承就可以了。

   好了,說了這麼多的具體頁面實現細節,讓我們來談一談cocoa這套架構吧!cocoa主要分為兩部分:fundation kit和application kit,具體這兩個有什麼區別我也沒有細細研究過,但是我明白的一點就是application kit似乎是更接近介面一點。在fundation kit裡面我們可以找到NSString,NSArray,NSDictoary等一些常用的類型,你也需要奇怪為什麼所有的類型前面都加了個NS呢?這就跟喬布斯,跟皮克斯有關係了,我還想說一點的就是cocoa這套架構頁面從早先皮克斯的一套架構脫胎過來的。那麼我們怎樣定義這些變數呢?比如在c#,java裡面我們需要一個string類型,我們就會直接string xxx;但是oc裡面卻不是這樣的,我們需要NSString *xxx;有沒有前面多了個*,這就是oc更接近c的原因了,在這個定義裡面我們能夠明確的看到當前的NSString變數是一個指標,它指向真正的對象。在c#,java裡面雖然string類型也是參考型別,也指向真正的對象,但是它們將自己隱藏的更好了。好了,一個NSString類型的變數定義好了,我們怎樣去初始化它們呢?是不是直接向c#裡面直接丟個""或者stirng.empty過去就可以了呢?其實oc裡面的執行個體化可以分為三類:1.new;2.使用相應的初始化函數;3.使用alloc init;oc裡面一般是不使用new的,我個人認為是需要自己釋放資源,當然你也可以將執行個體化的對象丟到自動釋放池裡面,而且事實上alloc init的這種方式就是這種情況;首先調用alloc分配資源,然後調用init初始化;

    好了,說完oc裡面一些基礎的類型,讓我們來看一看一些進階的特性:類別,委託,非正式協議,正式協議;在寫oc程式的時候,最不習慣就是方法的使用通常要用[]括起來,其實習慣之後,你就會探索方法調用讀來很想一句自然話;回到類別,類別就像是c#裡面的擴充方法,比如現在我們設想一下這種情況,如果我們需要調用一個.tostring方法自動實現輸出姓名+身份號+職業;c#裡面最好的方法是使用擴充方法,oc裡面也為我們提供這種實現,定義的方法是@類名<自定名稱>,然後下面就是方法的實現。其實類別還為拆分代碼,組織處理邏輯提供了便利;委託在oc裡面算是用的比較多的了,因為本身mvc模式,例如一個UITableView展示資料之後,使用者點擊某一項的操作,我們需要委託到一個方法裡面去處理,在標頭檔裡面(.h檔案)實現後面我們還需要顯示的實現委託跟資料來源;非正式協議就跟c#裡面的介面差不多了,只不過非正式協議定義的方法我們不需要全部去實現罷了;正式協議裡面我們需要用到一個專門定義的關鍵字,然後這裡面定義的方法,我們需要跟介面一樣全部實現;先說這麼多了。   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.