Object C學習初步


    最近乘着項目不太緊張的時候,趕緊給自己沖了一下電。其實我自己最熟悉的平台應該是.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#里面的接口差不多了,只不過非正式協議定義的方法我們不需要全部去實現罷了;正式協議里面我們需要用到一個專門定義的關鍵字,然后這里面定義的方法,我們需要跟接口一樣全部實現;先說這么多了。   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM