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 &

以上大概是Objective-C幾個特色

你真的不覺得既有C指針*的傳統美又有一些腳本語言語法糖的優雅么...


優點:

  • 優雅的消息傳遞機制
  • 動態特性
  • 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 |