1. 程式人生 > >iOS開發之NS_ASSUME_NONNULL_BEGIN和 NS_ASSUME_NONNULL_END

iOS開發之NS_ASSUME_NONNULL_BEGIN和 NS_ASSUME_NONNULL_END

    最近使用新更新的Xcode10.0新建類時,發現它自動為我們在.h檔案裡添加了NS_ASSUME_NONNULL_BEGIN和 NS_ASSUME_NONNULL_END。如下示例:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface WechatLoginBindPhoneController : UIViewController

@end

NS_ASSUME_NONNULL_END

    不過這並不是Objective-C的新特性,我們都知道在swift中,可以使用!和?來表示一個物件是optional

的還是non-optional,如view?和view!。而在 Objective-C中則沒有這一區分,view既可表示這個物件是optional,也可表示是non-optional。這樣就會造成一個問題:在 Swift與Objective-C混編時,Swift編譯器並不知道一個Objective-C物件到底是optional還是non-optional,因此這種情況下編譯器會隱式地將Objective-C的物件當成是non-optional

    為了解決這個問題,蘋果在Xcode 6.3引入了一個Objective-C的新特性:nullability annotations。這一新特性的核心是兩個新的型別註釋: __nullable

__nonnull 。從字面上我們可以猜到,__nullable表示物件可以是NULLnil,而__nonnull表示物件不應該為空。當我們不遵循這一規則時,編譯器就會給出警告。

    事實上,在任何可以使用const關鍵字的地方都可以使用__nullable__nonnull,不過這兩個關鍵字僅限於使用在指標型別上。而在方法的宣告中,我們還可以使用不帶下劃線的nullablenonnull,如下所示:

- (nullable id)itemWithName:(NSString * nonnull)name

    在屬性宣告中,也增加了兩個相應的特性,因此上例中的items屬性可以如下宣告:

@property (nonatomic, copy, nonnull) NSArray * items;

    當然也可以用以下這種方式:

@property (nonatomic, copy) NSArray * __nonnull items;

    推薦使用nonnull這種方式,這樣可以讓屬性宣告看起來更清晰。

    如果需要每個屬性或每個方法都去指定nonnullnullable,是一件非常繁瑣的事。蘋果為了減輕我們的工作量,專門提供了兩個巨集:NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END。在這兩個巨集之間的程式碼,所有簡單指標物件都被假定為nonnull,因此我們只需要去指定那些nullable的指標。

不過,為了安全起見,蘋果還制定了幾條規則:

  • typedef定義的型別的nullability特性通常依賴於上下文,即使是在Audited Regions中,也不能假定它為nonnull。
  • 複雜的指標型別(如id *)必須顯示去指定是non null還是nullable。例如,指定一個指向nullable物件的nonnulla指標,可以使用”__nullable id * __nonnull”。
    __nullable id * __nonnull
  • 我們經常使用的NSError **通常是被假定為一個指向nullable NSError物件的nullable指標。

相關推薦

iOS開發NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END

    最近使用新更新的Xcode10.0新建類時,發現它自動為我們在.h檔案裡添加了NS_ASSUME_NONNULL_BEGIN和 NS_ASSUME_NONNULL_END。如下示例: #import <UIKit/UIKit.h> NS_ASSUME_

芒果iOS開發ARCMRC混編

ARC工程中使用MRC的類: 在targets的build phases選項下Compile Sources下選擇要不使用arc編譯的檔案,雙擊它,輸入 -fno-objc-arc 即可 MRC工

iOS開發OC Swift混編

前言 相信很多開發者在開發過程中,使用別人封裝好的三方框架,但由於三方框架的開發語言(OC或者Swift)與現有工程的開發語言不一致,導致無法直接使用,那麼對於混編來說,是不二的選擇。 Swift專案使用OC框架 1. 建立橋接檔案,一般的命名規則(專案名-Br

iOS開發weakassign的區別

共同點: 都可以修飾物件型別的property, 不會增加其引用計數. 不同點: 1.出現時期, assign出現在ARC之前, weak出現在ARC之後; 2.可修飾的型別, assign既可

ios開發--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffsetNSString之間的轉換

距離 轉換 nsstring transform ans ins -c cto cnblogs 僅做記錄,一個函數和字符串之間的互相轉換 方法如下: UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point); UI

ios開發--tableview刷新某一個區某一行

anim ios開發 xpath set nsa sat array 代碼 tableview 在開發中,有時候,我們不需要刷新整個表,只需要刷新局部數據即可,具體代碼如下: //section刷新 NSIndexSet *indexSet=[[NSIndexSe

iOS開發根據按鈕確定點選的section row

  分組的tableview cell上面有按鈕,根據按鈕確定點選的是哪一組的哪一行。對於初學者來說不好判斷,那麼下面就來跟大家分享一下如何實現吧。   cell 方法裡面新增   [cell.pingjiaBtn addTarget:self action:@selector(didPingJiaBut

iOS開發根據按鈕確定點擊的section row

get ott 實現 事件 oid self. all 初學者 shopping 分組的tableview cell上面有按鈕,根據按鈕確定點擊的是哪一組的哪一行。對於初學者來說不好判斷,那麽下面就來跟大家分享一下如何實現吧。   cell 方法裏面添加   [cell.p

iOS開發知識iOS開發中allocnew的區別

1.在實際開發中很少會用到new,一般建立物件咱們看到的全是[[className alloc] init] 但是並不意味著你不會接觸到new,在一些程式碼中還是會看到[className new], 還有去面試的時候,也很可能被問到這個問題。 2.那麼,他們兩者之間到底有什麼區別呢 我們看原始碼:

iOS開發給navigationbarview設定同一張圖片

###### 效果一: 今天因為這個小東西被吐槽了...但還是決定記錄一下... 其實說是給navigationbar和view設定同一張圖片是不對的,應該是隱藏navigationbar,再去掉statusbar的背景色,新增view 最開始

iOS開發純Weex+Vuejs開發原生App整體結構除錯步驟(二)

前言 上一篇文章是根據Weex官方的介紹,啟動了Weex的Hello World的介紹以及一些外掛的安裝 環境部署和Debug 之前花了2周時間看了下Vue的語法和用法以及一些實戰介紹,畢竟是iOS開發,還是有必要把新學的東西寫下來,而且會寫的非常詳細,能保證從我git倉庫弄下來的基礎結構

iOS開發Weex爬坑路環境部署Devtools Debug(一)

前言 不多說,直接開始Weex,算是記錄這段時間對新技術的學習積累。期間看了很多Vue.js和Node.js的基礎,順便捋了以下CSS的flex-box佈局等等前端的知識,太多了太雜了,還是用筆記記錄下。直接從官方介紹,開始 補充一個傳送門:和文章沒什麼關係 JS中的async和await

iOS開發AutoLayout中的Content Hugging Priority Content Compression Resistance Priority解析

本篇部落格的內容也不算太複雜,算是AutoLayout的一些高階的用法。本篇部落格我們主要通過一些示例來看一下AutoLayout中的Content Hugging Priority以及Content Compression Resistance Priority這兩個優先順序。下方我們先來簡單的看一下這兩個

iOS開發設定導航欄標題的字型大小顏色

方法一:自定義檢視。 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 44)];

iOS開發32位64位系統

參考網址:http://blog.csdn.net/sakulafly/article/details/41089411 在蘋果推出iPhone5S時,64位的應用就走到了眼前。當時就看見蘋果官方資料宣佈iOS7.x的SDK支援了64位的應用,而且內建的應用都已經是64

iOS 開發 Object-CJavaScript互動詳解OC與JS互動在WKWebView中使用

1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr

iOS開發獲取iPhone/iPad/Android 介面icon尺寸規範

注意:iOS所有圖示的圓角效果由系統生成,給到的圖示本身不能是圓角的。1. 桌面圖示 (app icon)for iPhone6 plus(@3x) : 180 x 180for iPhone 6/5s

(0016)iOS 開發Mac上Navicat Premium 建立遠端連線本地連線

1.下載安裝 (百度雲盤裡面有安裝檔案和註冊機)   連結: https://pan.baidu.com/s/1kVG1k71 密碼: mr5g 2.破解之後還可以漢化: 把解壓的漢化中文包中的兩

iOS開發opencv學習筆記一:下載安裝

1. opencv是什麼? opencv是一個基於BSD開源協議的影象處理開源庫,截止本人編輯時間:2017年6月1日,最新版本為3.2.0。 2.哪裡可以得到opencv的原始碼以及不同平臺的動態庫? opencv的官方地址為http://opencv.org/,可以在這

IOS開發 ---- 振動強度時間(私有api)

void AudioServicesStopSystemSound(int); void AudioServicesPlaySystemSoundWithVibration(int, id, NSDictionary *); 3.呼叫  NSMutableDictionary* dict = [N