Objective-C 語法上有任何的優點嗎?
本人沒有實際用過 Objective-C,只是讀過一些教程。但是作為一個實際工作中學習使用過 JS、Java、C++、ActionScript、Ruby 等語言的人看來,Objective-C 不止是醜陋,簡直是無法忍受的醜陋。它真的有任何的優點嗎?
objc 是 C 的擴展。objc 的語法有個特點,就是擴展部分,跟 C 原有的部分,可以很明顯的區分開來。
objc 的擴展關鍵字,全部使用 @ 符號開頭。如 @interface, @property。
[obj dosomthingArg0:arg0 arg1:arg1];
objc 的這種語法,並非單純的函數調用,而是消息發送。使用方括弧,[],也跟 C/C++ 的圓括弧 () 的函數調用區分開來。
這樣獨特的語法,在跟其它語言寫在一起的時候。objc 的代碼也很容易分析出來。這樣的結果,就是 objc 跟 C/C++ 的代碼可以同時寫在同一個文件,不經過任何間接層,就可以相互調用。
假如兩個語言語法相似,寫在一起時候容易混淆,就做不到這點。比如 swift 跟 C++ 就不可以混編。
另外,objc 的語法,強制採用參數命名的方式。這樣寫起來有點啰嗦,但讀起來,很容易就知道每個參數的含義。objc 代碼中添加的注釋,明顯也會比 C++ 的要少。
比如 objc 中的代碼
[NSData dataWithBytesNoCopy:bytes length:size freeWhenDone:TRUE];
在 java, 或者 C++ 中可能會寫成
NSData.createNoCopy(bytes, size, true)
對比之下。objc 的可讀性好很多。
在 java/C++ 中,不建議介面中出現 bool 變數,objc 就完全沒有這個問題。
調用方法:
[aBoy playWith:you and:aGirl in:aBoy.house];
Block:
[aArray enumerateObjectsUsingBlock:?^(id obj, NSUInteger idx, BOOL *stop) {
[obj doSomthing];
}];
初始化容器:
NSArray *aArray = @ [@"1",@"2",@"3",@"4",@"5"];
NSDictionary *aDictionary = @{"1" : "一",
"2" : "@(2)",
"3" : "@(3.0)};
初始化原子類型對象:
NSNumber *aNumber = @ (1.0);
NSNumber *bNumber = @ (YES);
聲明成員合成攝取值方法明確內存管理語義:
@ property (strong ,nonatomic) NSArray *myArray;
繼承與實現協議:
@ interface : NSObject &
優點:
- 優雅的消息傳遞機制
- 動態特性
- Category
缺點:
- 不支持命名空間
- 蹩腳的KVO
- 蹩腳的多態
- Runtime 的各種黑魔法
- 引用計數的內存管理方式(會有循環引用)
- 鬼畜的布爾類型
- 輕量的面向對象特性 (由於支持C中的東西,裝入OO的容器需要wrap)
優點:
- @category
- 動態派發
- 無縫和 C 混編
- 提供 Objective C++ 使其能無縫和大多數 C++ 混編
以你沒有實際使用過的體驗,你來說說那些地方醜陋吧。(不要說出中括弧這麼表面的話)
再說了醜陋又怎樣,即便 Objective-C 的成功純粹就是蘋果商業上的成功,你能奈他何?
更何況終歸是要交給 Swift 的。寫習慣了爽的要死,調用方法你覺得還有什麼語言可以做到見參數知意義的么(除了Swift)?很多語句連起來都能組成人類可讀的句子,block語法簡直不要太好用,Foundation類庫也是用起來很順手,長期開發OS X/iOS有種中毒的感覺。
用習慣感覺真是爽!
和其它語言比,方括弧調用函數(o c裡面中發送消息),再加上顯式參數,實在太優雅了。寫完才發現劉慶駿老弟已經回答的很具體。加上協議和類目,o c在語法也是這幾個「特產」。語法很彆扭。
Swift (programming language)"Swift is, in large part, a reimagining of the Objective-C language using modern concepts and syntax."這樣就是說 Objective-C 沒有 modern concepts and syntax 唄。三大移動平台各有不爽。
沒有
把我在別的答案的評論里的答案貼過來
有一個我很喜歡的是方法調用的時候,帶上參數名稱的這個特點。比如 [obj callMethodWithArg1: arg1 arg2: arg2] 這樣的方式。剛接觸 objc 的時候覺得怎麼這麼蛋疼,不過寫了一陣子之後覺得這個特性真的太爽了。舉一個稍微複雜點的例子,你們感受一下。cocoa 裡面搞 auto layout:
[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:vc.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]如果是 C++ 的話,很可能是這樣:NS::LayoutConstraint(this-&>view, NS::LayoutAttribute::Bottom, NS::LayoutAttribute::Equal, vc-&>view, NS::LayoutAttribute::Bottom, 1, 0)你說你看到上面的代碼的時候,哪一個可讀性更好一些?this-&>view 和 vc-&>view,分別是什麼意思?最後面的 1 和 0,又分別是什麼意思?而 objc 裡面,每個參數是什麼就很明了了。當然,如果沒用 IDE 的話確實會敲得很痛苦。
哦對了,如果在 IDE 裡面的話,代碼是可以格式化得很好看的[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:vc.view
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0]
優點:寫起來舒服得飛起,就像iOS系統的體驗一樣流暢,易用。
缺點:寫不了幾年了。這是什麼神邏輯...怎麼感覺是在瞎說呢,作為個實際使用過那麼多編程語言的人,居然能輕易說出某種語言很醜陋這種觀點,還不舉些實際的例子...
firlst,作為一個只接觸過java、oc和很少的腳本語言的programer,個人的看法可能不具有參考性
最大的感受是可讀性更好 比如方法命名要求有描述性 這個優點是對閱讀代碼來說流暢更多,對naming水平一般的程序員(這很可能是80%的程序員)來說是福音。其實對一些top級別的,影響不到,看到好多人直接用c的格式來寫很多內容了。
然後是現在多線程也比較方便。
其他的,諸如 array、nsnumber這些語法糖什麼的,只是逐漸趕上了一些腳本語言的節奏。說一個我經常在用的冷門語法,以一個登陸按鈕為例:
_loginButton=({
UIButton *_=[[UIButton alloc]initWithFrame:CGRectMake(20, CGRectGetMaxY(line6.frame)+30, WIDTH-40, 40)];
[_ setBackgroundColor:[UIColor colorWithRed:0.910 green:0.306 blue:0.251 alpha:1.000]];
[_ setTitle:@"登錄" forState:UIControlStateNormal];
_.layer.masksToBounds=YES;
_.layer.cornerRadius=M_PI*2;
_;
});
還有傳說中的「自敘體」。
無比純潔的中括弧語法。尷尬的加減號。還有無比蛋疼的block ,參考http://fuckingblocksyntax.com/ 我覺得就這些,題主問的重點是語法。語法上。優點:學了段代碼,就是寫了篇文章。缺點:有時候感覺objc很啰嗦
You are wrong.
語言都是在你學之前看著異常醜陋,不信你找個文科生來看你認為所謂漂亮的JS、Java,C++。
推薦閱讀:
※有哪些令人拍案叫絕的代碼/優化?
※你見過哪些令你瞠目結舌的C#代碼?
※Mathematica怎樣才能提高可讀性?
※為什麼程序語言要設計成使用這麼多shift?
※為什麼說 Smalltalk 超前了 20 年?
TAG:編程語言 | 編程 | Objective-C |
