自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么說(shuō)Objective-C很難學(xué)?

移動(dòng)開(kāi)發(fā) iOS
作為一個(gè)網(wǎng)絡(luò)上的活躍分子,使用Objective-C的開(kāi)發(fā)者,我收到了許多圍繞Objective-C的提問(wèn)。這些問(wèn)題在人們學(xué)習(xí) Objective-C或者嘗試開(kāi)發(fā)app的時(shí)候會(huì)不斷跳出來(lái),而且其中的某些問(wèn)題可能籠統(tǒng)如“Objective-C看起來(lái)太難了”也會(huì)細(xì)致若“那個(gè) ‘-’是干嘛用的啊?”。我要說(shuō)的是這些其實(shí)都是好問(wèn)題,那么接下來(lái)我就和大家探討一下:相對(duì)于Ruby或Java,為什么某些程序員對(duì)轉(zhuǎn)投iOS或者 OS X開(kāi)發(fā)會(huì)心存畏懼。

作為一個(gè)網(wǎng)絡(luò)上的活躍分子,使用Objective-C的開(kāi)發(fā)者,我收到了許多圍繞Objective-C的提問(wèn)。這些問(wèn)題在人們學(xué)習(xí) Objective-C或者嘗試開(kāi)發(fā)app的時(shí)候會(huì)不斷跳出來(lái),而且其中的某些問(wèn)題可能籠統(tǒng)如“Objective-C看起來(lái)太難了”也會(huì)細(xì)致若“那個(gè) ‘-’是干嘛用的?。?rdquo;。我要說(shuō)的是這些其實(shí)都是好問(wèn)題,那么接下來(lái)我就和大家探討一下:相對(duì)于Ruby或Java,為什么某些程序員對(duì)轉(zhuǎn)投iOS或者 OS X開(kāi)發(fā)會(huì)心存畏懼。

語(yǔ)法

先說(shuō)說(shuō)編程語(yǔ)言是什么。所謂編程語(yǔ)言就是一種人可以讀得懂的程序代碼。一門(mén)編程語(yǔ)言通常包含一系列內(nèi)容:語(yǔ)法(語(yǔ)句書(shū)寫(xiě)和聲明的規(guī)則)和語(yǔ)義(以達(dá)成某些任務(wù)為目標(biāo),把語(yǔ)句和聲明有效的結(jié)合起來(lái))。

大部分(通常情況下)編程語(yǔ)言在方法調(diào)用上都是類似C語(yǔ)言的風(fēng)格,訪問(wèn)類成員采用.語(yǔ)法。(也就是C中的 structs)。雖然這些語(yǔ)言一般都有各自己定義類的方式(Java和C#或C++還是不大相同的),但是追究到語(yǔ)言的諸多細(xì)節(jié)還都是很相似的。每當(dāng)人 們開(kāi)始接觸一門(mén)新的編程語(yǔ)言的時(shí)候,如果它的語(yǔ)法看起來(lái)很似曾相識(shí),會(huì)讓學(xué)習(xí)者覺(jué)得很舒服。像大多數(shù)人都是有C語(yǔ)法背景的,所以要學(xué)習(xí)一門(mén)類C語(yǔ)法的語(yǔ)言 的話,第一觀感會(huì)很親切。

單從語(yǔ)法角度來(lái)看,Objective-C可謂**別具一格**。它的語(yǔ)法太特別了,礙于它語(yǔ)法的另類,很多人沒(méi)有耐心去深究它的語(yǔ)義,而它的語(yǔ)義恰恰與C++,Java等語(yǔ)言沒(méi)什么區(qū)別。

像Python和Ruby這些所謂”古怪”的語(yǔ)言都更容易上手,僅僅是因?yàn)樗鼈兛梢酝ㄟ^(guò).語(yǔ)法來(lái)進(jìn)行方法調(diào)用和訪問(wèn)類成員。而且人們通常能夠迅速習(xí)慣用縮進(jìn)來(lái)代替花括號(hào)。

當(dāng)我向別人介紹Objective-C的時(shí)候,一般情況下,我會(huì)拿它和某個(gè)OOP(面向?qū)ο缶幊蹋┱Z(yǔ)言來(lái)對(duì)比說(shuō)明。

why objective-c is hard to learn 1

目前來(lái)看還OK。也許他們之前知道lisp吧,所以不難理解這句語(yǔ)法。

why objective-c is hard to learn 2

到這句,人們普遍覺(jué)得比較難接受,情況也變得不那么樂(lè)觀了。

why objective-c is hard to learn 3

這句可以直接讓人們崩潰了。

那些冒號(hào)是啥?太嚇人了!隨后冒出一堆問(wèn)題:方法是怎么調(diào)用的?是通過(guò)performAction還是什么別的方式?方法怎么重載?

要知道,我們沒(méi)有在討論方法,我們說(shuō)的是消息(messages)(我也不會(huì)去討論他們之間的區(qū)別)和selectors,好比上文所呈現(xiàn)的performAction:withTwoParameters。但是,大家已經(jīng)懶得去了解了。

Objective-C是C的超集,它其實(shí)是一門(mén)很cool的編程語(yǔ)言,但是由于其自身的某些特點(diǎn),相較于其他現(xiàn)代編程語(yǔ)言,人們會(huì)覺(jué)得 Objective-C很古老。作為C的超集,Objectivec-C在C的基礎(chǔ)上擴(kuò)展了一系列非常規(guī)的特性,這恰恰增加了Objective-C的復(fù) 雜度。

Objective-C是一門(mén)大型語(yǔ)言。下此定義的出發(fā)點(diǎn)是:它的語(yǔ)法十分繁復(fù)。實(shí)際上,蘋(píng)果已經(jīng)在加大對(duì)Objective-C瘦身的力度,比如 說(shuō),雖然速度緩慢但是終究還是完成了頭文件去標(biāo)準(zhǔn)C風(fēng)格的過(guò)渡。而且,蘋(píng)果還為Objective-C做了不少改進(jìn),增加了許多新特性,使得 Objective-C的代碼更加簡(jiǎn)練,比如:

  • Synthesizing properties
  • 通過(guò).語(yǔ)法訪問(wèn)getters/setters
  • 垃圾回收(Garbage Collection)
  • Blocks(閉包c(diǎn)losures)
  • ARC(Automatic Reference Counting)
  • 弱引用(Weak references)

所以,雖然語(yǔ)言變得越來(lái)越龐大,但是開(kāi)發(fā)編寫(xiě)代碼的復(fù)雜度反而降低了。

Runtime

Objective-C是動(dòng)態(tài)運(yùn)行的,可能單單從其與C的淵源這個(gè)角度來(lái)看這個(gè)特性并不那么直觀。由于不需要直接編寫(xiě)匯編碼,C語(yǔ)言自身是一門(mén)變化 較低的語(yǔ)言,鑒于Objective-C是C的超集,我們很容易將Objective-C的穩(wěn)定性趨向于C,但現(xiàn)實(shí)際上,Objective-C是動(dòng)態(tài)運(yùn) 行的且靈活性相當(dāng)高的語(yǔ)言。Objective-C支持函數(shù)柯里化(function currying),支持反射機(jī)制,可以在運(yùn)行時(shí)動(dòng)態(tài)地為類添加或移除方法。

除非你之前有接觸過(guò)類似Objectivec-C這些特性的編程語(yǔ)言,比如說(shuō)Ruby或Lisp,否則一時(shí)間很難適應(yīng)Objective-C。但是無(wú)需擔(dān)憂!有些東西,外表看起來(lái)神秘可怕其實(shí)本質(zhì)沒(méi)那么復(fù)雜。

Framework

使用Objective-C構(gòu)建apps完全離不開(kāi)Cocoa/Cocoa Touch框架。就好像用Ruby開(kāi)發(fā)web應(yīng)用離不開(kāi)Rails一樣。

經(jīng)過(guò)經(jīng)年累月的發(fā)展,Cocoa已經(jīng)變得非常的厚重。不過(guò)如前文所說(shuō),蘋(píng)果最近正在逐漸的為常規(guī)iOS開(kāi)發(fā)所依賴的Cocoa Touch框架進(jìn)行減肥,以降低它的復(fù)雜度。即便如此,哪怕要開(kāi)發(fā)的app極其簡(jiǎn)單,也還是有許多東西要學(xué),像蘋(píng)果的官方文檔還有已暴露的各種頭文件都是 很好的學(xué)習(xí)資源。就拿UIView中的contentStretch屬性為例,頭文件的定義和說(shuō)明如下:

@property(nonatomic) CGRect contentStretch __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

// animatable. default is unit rectangle {{0,0} {1,1}}

這到底是什么意思呢?按照我的理解,這個(gè)屬性是用來(lái)描述可伸縮區(qū)域的大小。但是怎么實(shí)現(xiàn)的呢?這個(gè)區(qū)域是指一個(gè)矩形嗎?也許你永遠(yuǎn)都不會(huì)和這個(gè)屬性 打交道,但是假如在開(kāi)發(fā)過(guò)程中的某個(gè)時(shí)點(diǎn)和場(chǎng)景下使用這個(gè)屬性能夠輕松解決你的問(wèn)題,那個(gè)時(shí)候你會(huì)知道它的存在并能正確的使用它嗎?

Cocoa/Cocoa-Touch是龐大的框架。要真正的駕馭它就只能靠熟能生巧了。但這個(gè)熟悉它的過(guò)程常常使很多新的學(xué)習(xí)者退縮。

History

一直以來(lái),蘋(píng)果都在不停的推動(dòng)著圍繞Objective-C語(yǔ)言開(kāi)發(fā)體系的進(jìn)步,像Objective-C runtime,Cocoa/Cocoa Touch框架以及針對(duì)Objective-C的編譯器等一系列更高層面設(shè)計(jì)的交叉重疊使得Objective-C不僅僅是一個(gè)語(yǔ)言這么簡(jiǎn)單。

why objective-c is hard to learn 4

所以當(dāng)學(xué)習(xí)Objective-C的時(shí)候,不能孤立的去學(xué)習(xí)這門(mén)語(yǔ)言、某些框架、它的運(yùn)行機(jī)制或編譯器,而是要把他們?nèi)跁?huì)貫通。比如說(shuō)現(xiàn)在 Objective-C集成的ARC(Automatic Reference Counting)機(jī)制就涉及到了語(yǔ)義(不需要顯示調(diào)用dealloc了)層面、編譯器層面(顯而易見(jiàn))、以及對(duì)Cocoa/Cocoa Touch框架的命名約定等內(nèi)容。

上文所提到的圍繞Objective-C的一些列緊密關(guān)聯(lián)的設(shè)計(jì)算是其獨(dú)有的特點(diǎn)。其他的語(yǔ)言或多或少都會(huì)依賴于別的的語(yǔ)言或平臺(tái)來(lái)運(yùn)行,比如基 于.net運(yùn)行的Iron Python,不是Java但是卻依賴JVM的Clojure,甚至Ruby和Rails其實(shí)都有各自相對(duì)獨(dú)立的實(shí)體和工程。唯一一個(gè)比較知名的受 Cocoa/Cocoa Touch和Objective-C runtime支撐運(yùn)行的Mac Ruby,后來(lái)也被蘋(píng)果停掉后了后續(xù)支持。

Objective-C和相關(guān)的框架、runtime以及編譯器等等這個(gè)體系對(duì)其他開(kāi)發(fā)者社區(qū)而言是又幾乎是封閉的。

未來(lái)

從目前掌握的信息來(lái)看,過(guò)去的四年來(lái)蘋(píng)果一直在嘗試降低Objective-C語(yǔ)言的復(fù)雜度。淘汰手動(dòng)內(nèi)存管理以及C標(biāo)準(zhǔn)頭文件,引入更符合當(dāng)下編程語(yǔ)言潮流的ARC機(jī)制,還有通過(guò).語(yǔ)法來(lái)訪問(wèn)屬性的getter/setter方法等等都是為了降低Objective-C的學(xué)習(xí)成本。但是即便如此,Objective-C仍然是具備一定學(xué)習(xí)門(mén)檻的開(kāi)發(fā)語(yǔ)言,它的熱度完全那些基于Objective-C編寫(xiě)的熱門(mén)iOS應(yīng)用帶起來(lái)的。

責(zé)任編輯:閆佳明
相關(guān)推薦

2012-03-07 13:43:59

Objective-C

2015-09-07 09:53:02

Objective-CRuntime

2011-08-10 18:07:29

Objective-C反射

2011-05-11 15:58:34

Objective-C

2013-03-27 12:54:00

iOS開(kāi)發(fā)Objective-C

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2011-05-11 11:20:26

Objective-C

2017-02-10 09:55:53

SwiftObjective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-08-02 13:16:36

Objective-C 語(yǔ)法 函數(shù)

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2013-08-21 14:57:42

objective-c問(wèn)題

2011-05-11 14:06:49

Objective-C

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2014-04-30 10:16:04

Objective-CiOS語(yǔ)法

2011-08-03 16:55:05

Objective-C 代理

2011-07-08 13:49:46

Objective-C UUID

2011-07-29 16:16:30

Objective-c block

2011-08-04 09:35:09

Objective-C 編碼規(guī)范
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)