歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C現代語法與新特性

Objective-C現代語法與新特性

日期:2017/3/1 9:21:09   编辑:Linux編程

Swift的確是一個很強大的語言,各種特性使用起來非常簡潔強大,但是目前來說,感覺成熟度還是不夠,所以商業項目中使用OC來說是比較穩健的行為。看來一下WWDC 2015的 Swift and Objective-C Interoperability session,視頻前半部分主要是講解swift和OC之間的交互的規則,後面則講到OC的一部分新的語言特性,這幾個特性,Apple的開發人員在 WWDC上說的那樣,對代碼的可讀性提升非常大,所以從swift中把這個特性引入到OC中,個人感覺也是為後續向swift的遷移提供支撐,最主要的是 這些特性在iOS SDK中以及全面采用並且兼容低版本,所以可以在當前工作中引入這些特性。

文章的前半部分記錄一些之前的Objective-C的現代語法,後面講解WWDC 2015中介紹的新特性,詳細建議去觀看WWDC 2015的視頻。

instancetype

這個方面可以參考我之前總結的一篇博客,關於 id、NSObject *、id 、instancetype的區別 : http://www.linuxidc.com/Linux/2015-11/124743.htm

Properties

使用Properties來代替實例變量有很多優勢:

  • Auto synthesized getters and setters. 使用@property聲明的屬性能自動生成getter與setter方法。
  • Better declaration of intent of a set of methods. 比為屬性聲明一系列方法代碼上要清晰很多。
  • Property keywords that express additional information about behavior. Property使用其他的一些關鍵子可以表達一些實例變量無法表達的信息,比如 assign, weak, atomic等等。

Property方法有一個非常簡明的命名規范,getter方法的名稱是property的名稱,setter方法的名稱是在property名稱之前添加set前綴(駝峰法)。通過還可以通過getter關鍵字指定getter的名稱。

在聲明一個Property的時候,需要記住下面這些不能是properties的:

  • init method
  • copy method, mutableCopy method
  • A class factory method
  • 初始化一個action並返回一個BOOL結果的方法
  • A method that explicitly changes internal state as a side effect of a getter

Enumration Marcos

使用NS_ENUM來定義枚舉,使用NS_OPTIONS來定義options。這兩個宏可以改善Xcode中的代碼補全,明確指出枚舉和options的類型和大小。

Object Initialization

可能是為了兼容swift,OC中添加了 designated initializer 初始化方法和 convenience initializers 初始化方法:

  • designated initializer : 負責調用superclass的初始化方法以及初始化自己的實例變量的初始化方法
  • convenience initializers : 非designated initializer都被稱為designated initializer。這些initializer內部實現一般都是調用另外一個initializer,然而最終一系列鏈式調用之後,最終都會調用某 一個designated initializer 方法來進行初始化行為。

實現一個designated initializer方法很簡單,通過NS_DESIGNATED_INITIALIZER宏即可實現,但是使用designated initializer的時候,會有一些限制規則,跟swift中的這些規則非常類似。詳情可以參考: https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html

WWDC 2015

Nullability

Nullability特性用來指明 Objective-C/C 指針是否可以為nil。顯然,使用這個特性更能清晰表達API的意圖,同時可以提升編譯器的static checking,還有一點就可以提高這些API在swift中的可用性。如果使用Xcode 7的話,可能注意到在iOS SDK中這個特性已經被大量采用了。下面這種截圖說明了Nullability的用法。

OC是如何引入這個特性,並且又讓低版本的iOS支持的呢?Apple稱之為 Audited Regions,也就是下面這兩個宏之間的區域,NS_ASSUME_NONNULL_BEGIN … NS_ASSUME_NONNULL_END。

Audited Regions對其中的指針做了一些默認的假設,Single-level指針被認為是nonnull的,NSError**指針被認為在各個指針 level上面都是nullable的。所以我們在Audited Regions內只需要指明那些 nullable 或者 null_unspecified的場景。

在C指針中使用 Nullability 的話,與OC中不同的地方在於,使用的nullability qualifier需要在前面添加雙下劃線,並且要將nullability qualifier寫在指針後面。例如下面:

Lightweight Generics

這個輕量級泛型,一方面會提高代碼可讀性,讓API變得更加清晰。另外一方面,還能使編譯器會幫助我們做一些類型檢查,找到一些潛在的錯誤,達到 Type Safety的效果。

日常主要的用法是針對兩個集合類的,NSArray與NSDictionary,詳細用法可以參考官方SDK中的使用。同時,我們也可以在我們自己的代碼來使用這個輕量級泛型,在自定義類,category,extension等等。

自定義類中的使用語法:

Category / Extension的使用語法:

WWDC中還強調了一點是,Lightweight Generics 是向前兼容的,不會更改OC的runtime,同時也不會對生成的代碼造成任何影響。

__kindof

在OC中,我們的代碼中會大量使用id這個特性,這個特性用起來會帶來很多很方便的特性,但是它有個缺陷,我們經常需要進行強制類型轉換。 Xcode 7中有個新特性,__kindof,“Kindof” types express “some kind of X”,用__kind修飾的變量表示是某個類或者這個類的子類。

當我們把這個類或者子類的其他變量賦值給這個變量時,編譯器會默認幫我們進行類型轉換以及類型檢查工作,這樣就不需要我們寫一些強制類型轉換這樣 的代碼了。最簡單的一個例子是在UITableView的應用,cellForRowAtIndexPath:返回的變量使用這個修飾之後,我們就不再需 要寫任何強制類型轉換了,例如,CustomCell *cell = [tableview cellForRowAtIndexPath:indexPath];

同時,我們可以將Kindof types和lightweight generics結合在一起,比如官方提供的特性:

關於id類型

看了上面這些新特性之後,你會發現在平時開發中,你真的還需要那麼多id嗎?大多數情況下,我們都可以使用一個更加精確的類型表示,這樣能避免一些例如 type safety的問題,同時也能讓代碼更加清晰。下面看一下官方指明的替代id的情景:

  • 在返回 “self” 的方法中,使用instancetype來代替id
  • 大多數 Collections 都可以變成 Typed Collections 來代替id
  • __kindof X * 來表示 “some subclass of X”,而不再使用id,可以減少類型強制轉換之類的代碼
  • id 表示conforms to SomeProtocol的任意類型

那什麼情況下使用id呢?只有那些你確認要表示”an object of any type”的時候再使用id,否則,盡量使用其他語法代替id。

Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm

Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm

使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm

10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm

Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm

好學的 Objective-C 高清PDF http://www.linuxidc.com/Linux/2014-09/106226.htm

Copyright © Linux教程網 All Rights Reserved