在使用了多年 C# 的情況下,如何轉型到 Objective-C 語言?
背景:
1. 我說C#是現代化語言,是因為我覺得她語法優雅,清晰簡單。
2. 剛接觸OBJ-C幾天,語法都沒搞明白。接觸BASIC、VB、C、C++,這4門語言,都是在高中時短期使用,上大學,工作後,就基本沒有接觸了。
05年大學開始,接觸C#,然後是工作,一直是與C#打交道。最近想轉型,做IOS開發,開始接觸OBJECTIVE-C
剛開始,怎麼說,感覺OBJ-C的語法很神經,很落後,完全沒有C#那簡單清晰的樣子。
感覺OBJ-C語法就是亂七八槽,各種 * ( ) [ ] - + @ 到處亂飛
多方法參數看起來完全一團糟。
當然,OBJ-C能大行其道,我覺得她肯定是她有優點,只是,可能我沒發現而已。
所以,如何使我去發現OBJ-C的美,不抵觸的去接近她?PS:
一開始提問時,拼錯了,拼成了OBJECT-C,被人噴了,我知錯了,已改正。
原來我一直認知錯誤。
發現真正能夠解決題主問題的人沒幾個。
Objective-C 與 C#同姓不同源。雖然言明了都是從C(花括弧語言)發展來的。C#最初的設計思路源於MS針對C++和Java的各種各樣的結合。而Objective-C中你所感到的奇葩的語法幾乎都是變形自Smalltalk。
這樣做一個對比:如果說C++是「C with classes」,那麼Objective-C可以看作是「C with objects」吧。
Objective-C相對的優點:
- 純粹的消息傳遞風格
- [a has: b with: c]這種方式,比很多動態語言(Python等)的關鍵字參數更加緊湊。比C#/Java的方法調用也看起來直接一些(當然,外層的方括弧很醜)。
- 介面與實現分離
- @interface 和 @implementation 這種模式,借鑒了C/C++的頭文件風格。對於組織和隱藏細節很有效。
- 同時可以通過某種方式實現類似C#中的partial class的效果。
- 自動內存管理(相對於C++)
- 語言級的閉包支持(相對於Java)
- 另外也是很重要的一點:Apple提供了不錯的開發套件和組件庫,並且相應的參考資料也算是比較齊全。
非專業Objective-C開發者。個人見解,輕噴。
xaramin和unity 3d讓你在ios上也可以繼續使用你心愛的C#,你一定會喜歡的
來,題主,跟我一起寫:
Objective-C
寫錯了可是會被噴的哦(被噴過的淚流滿面……
我真心覺得,題主如果你這麼糾結語法美感問題,那就不要寫Objective-C嘛,又不是說一定要寫。什麼
不抵觸而感受她的美
,我覺得你這對於C#的熱愛已經到了一個境界了,才用了Objective-C幾天就已經到了給出
感覺OBJ-C的語法很神經,很落後,完全沒有C#那簡單清晰的樣子
這種評論的地步了,你對於Objective-C的厭惡已經被定性了啊,我們就算是說再多也沒法改變你常年寫C#積累的語感,和由於這種語感對於其他不同思想的語言產生的厭惡。
我個人在很多語言之間切換了很久,一直以來都沒有發現絕對喜歡,絕對順手的語言。題主對於C#的那種感覺,說實在是我一直在追求的。
我認為,既然你已經對於一門語言這麼有感覺了,就不要再嘗試切換了,真的,就算是讓你切換,你也會抱著極其厭惡的心情,就像你在題目補充中寫下的文字透露出的感情一樣。
人終要有歸宿,程序員也是,也許你的歸宿,就是C#吧。
放棄轉型吧,就像你自己認為的那樣:『C#是現代的先進語言,Objective-C是落後的』人沒有必要學自己認為落後的東西,真的,無論對錯
用C#和oc對比,我也會覺得C#語法簡單,容易上手。
然後,然後我就發現我錯了,我不應該這樣去對比的。
C#是什麼?完全面向對象的語言,需要運行在.net framework 之上,你寫的代碼並非直接與操作系統交互,而是通過別人給你寫好的一個框架去交互操作系統。
oc呢,說白了其實就是一個C的運行庫,或者你可以理解為C的一個補丁,因為C語言不支持面向對象,因為C語言的內存管理起來太累。。。 現在你可以理解為什麼那麼多奇怪的符號了:熟悉的符號都被C語言用掉了,再繼續擴展只有用一些其他的了吧。
在語法層面上,oc跟C#去比肯定是沒有任何優勢了。在語言層面上,oc的效率肯定不錯,oc可以直接和c/c++混合編寫,oc可以運行在mac、ios、任何gcc支持的平台上進行編譯,oc可以寫出來蘋果上具有藝術感的界面。
我能說的就這些了,如果樓主仍然存在抵觸,不妨放棄吧,何不用c#去寫windows phone?
贊同其他幾位的答案。
其實objective-c很好用。雖然語法有點不習慣,記不住,但是反正XCode幫你自動補全,還擔心啥。
有的地方,用objective c來寫很清晰,而用android的java來寫我剛開始還很不習慣呢。比如,網路請求我包裝成了回調,objective c裡面直接一個block搞定。java裡面呢?後來我也找到實現的方法了,得另外聲明一個介面。
相比之下,java代碼的冗餘度也很高。
看了看其他人的回答,還有題主的問題,我可以說,其實你們都偏激了嗎。。
在我回答問題之前,我想說,作為一個程序員,應當有迅速上手一門新語言的能力,我指的是語法和設計思路。
可是如果你一開始就帶著偏見去學習一門新的語言,那你的態度就已經是不正確了。
至於OC的優點,我簡單講講我的看法。
1.OC是基於消息傳遞。看起來是調用函數實則是發送消息。剛學習OC的時候,由於長久下來C函數式的寫法會相當不習慣。但是熟悉以後,你會覺得,調用一個方法就像說一句話一樣非常自然。而且變數出現在恰當位置也使得閱讀性比較好。
可能我的表述不是很清楚,我舉個例子:
- (void)setCornerRadius:(CGFloat)radius forCircle:(id)circle;
void setCornerRadius(Object circle,float radius);
上面兩個分別是OC和C#的寫法。從這個例子你可以很明顯的發現OC的表述方式更清晰,更易於理解。你如果多翻翻ios sdk裡面的庫函數,你會發現很多這樣的例子。
2.內存引用計數規則。雖然引用計數不是OC的專利,但我依然想說一下這個。C#使用的是自動垃圾回收的機制,C++完全是靠程序員自己控制。而OC更像是這兩者的折中。由於移動平台內存緊張的特徵,使得像C#這樣的垃圾回收其實是不太合適的(Android使用的java同樣是垃圾回收)。內存引用計數明確規定了一些計數原則,在遵守這些計數原則的前提下,內存使用大為減少。而ios5.0後,引入的「自動引用計數」使得程序員的工作大大減輕且依然保持性能優勢。隨著移動設備的軍事競賽,這點優勢還在不在,就另當別論了。
3.分類的概念。題主非常喜歡使用C#,不知道又沒有遇到一種情況是需要給很多個類模型增加方法。如果前期沒有設計好,我們就需要補一個基類,然後在基類寫這個方法,然後再增加繼承關係。這樣的工作非常繁瑣,當然你可以說這是架構設計不合理,但是同樣的問題在OC下,用分類的概念就可以解決了。舉個例子
@interface UIViewController(CustomView)
-(void)extMethod;
@end
(補充說明:C#有擴展方法能達到類似效果,但是寫起來遠沒有OC簡潔清晰方便。)
上面這個小片段為系統的原生類UIViewController在runtime時增加一個新的方法。而不需要去寫一個新類繼承於UIViewController,同時這種寫法,也可以用於取代系統原生的一些函數,以達到某種目的。
4.多線程編寫難度大為降低。先不說系統提供的performSelectorInBackground等方法,即便是GCD或者NSThread,編寫難度也比C#小多了。代碼也更清晰。
5.block的概念。這個類似於C#的lamada表達式,我就不多說了。
6.OC是C的超集。我們都知道C是沒有類的概念。OC引入了類的概念。和C#不一樣,C#中int類型其實是System.Int32而不是基本類型,但是OC裡面int就是C語言裡面的基本類型。這個時候@的作用就出來,@"123"的作用是講字元串數組"123"變為一個NSString對象。+代表靜態方法,-代表類方法成員,我想這是表達方式的區別,沒啥好說的吧。
問題從來不是Objective-C啊!而是Xcode啊!
說明你編程沒入門。
同沒發現OC的美,簡直就是反人類
建議不要轉!如果你能忍受這種調用函數方式
NSString *jsonStr = [[[NSString alloc]initWithData:[GTMBase64 decodeString:jStr] encoding:NSUTF8StringEncoding] stringByReplacingOccurrencesOfString:BLS_JSON_SPLIT withString:@"""];
不編程序好多年,但各類語言都有接觸,感覺語言就是個工具,入鄉隨俗吧,該什麼環境就用什麼語言。編程的最高境界是不是類似武功的最高境界,無招勝有招?不管什麼語言都能拿來就用,反正都是些語法約定,關鍵還是數據結構和演算法,不是么?
語法是小問題吧,習慣就好了。
我覺得只要有不錯的c的基礎學習obj-c是件很方便的事,而且我個人認為obj-c的描述可能比c++還要清晰,雖然它的成功應該與apple的成功有很大關係。
OC的美不僅僅在於語言本身,想想Apple,Xcode以及眾多優美的Apps你就能體會了
並不覺得 C# 哪裡清晰簡單,很花哨倒是真的。
並不覺得到這裡來提問能幫助你發現ObjC的美。
我覺得是你接觸的語言太少了,導致看法片面。
那你去看下Lisp不是要瘋了?
每種語言都有自己美的地方好么 - -
還是多寫點代碼來的實際啊,習慣就好了...
問題很嘲諷啊,其實objective-c真的比你想的好太多了,你有偏見只是因為你不了解,要是真心想轉型, 就花點心思研究下,清空腦袋從零開始,要不然是學不進東西去的。
看看C++老程序員對Objective-C的分析
雲風的 BLOG: Objective-C 的對象模型
Obj-C其實也很優雅,樓主去學習一下蘋果官方那個Obj-C的文檔吧,學習下這門動態語言,學完了你可能會喜歡上這門語言。那個文檔好像叫《Learning Objective-C》。
我來說說objc相比c#不好的地方
- 沒有泛型
- 沒有除了array和dictionary之外的現成容器可用
- 內存管理,雖然現在有了arc,但是一來有的時候不允許用arc(ios &< 5, osx &< 10.7),二來混合了c/c++代碼的時候那一塊的內存還是要自己管理
- 在osx/ios之外幾乎沒有用,雖然有linux上也有個openstep
- xcode真心不好使,這跟obj沒啥關係呵呵
推薦閱讀:
※程序員基礎扎不紮實,對實際的開發工作有什麼影響?
※C++數組有一個致命缺陷,為什麼一直沒有人發現?
※怎麼學習 C++ 類的設計?
※如何評價漫畫《NEW GAME!》中人物櫻寧寧的編程水平?
※如何通俗的理解機器學習中的VC維、shatter和break point?
TAG:編程 | iOS開發 | Objective-C |