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
__nullable
表示物件可以是NULL
或nil
,而__nonnull
表示物件不應該為空。當我們不遵循這一規則時,編譯器就會給出警告。
事實上,在任何可以使用const
關鍵字的地方都可以使用__nullable
和__nonnull
,不過這兩個關鍵字僅限於使用在指標型別上。而在方法的宣告中,我們還可以使用不帶下劃線的nullable
和nonnull
,如下所示:
- (nullable id)itemWithName:(NSString * nonnull)name
在屬性宣告中,也增加了兩個相應的特性,因此上例中的items屬性可以如下宣告:
@property (nonatomic, copy, nonnull) NSArray * items;
當然也可以用以下這種方式:
@property (nonatomic, copy) NSArray * __nonnull items;
推薦使用nonnul
l這種方式,這樣可以讓屬性宣告看起來更清晰。
如果需要每個屬性或每個方法都去指定nonnull
和nullable
,是一件非常繁瑣的事。蘋果為了減輕我們的工作量,專門提供了兩個巨集:NS_ASSUME_NONNULL_BEGIN, NS_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開發之ARC和MRC混編
ARC工程中使用MRC的類: 在targets的build phases選項下Compile Sources下選擇要不使用arc編譯的檔案,雙擊它,輸入 -fno-objc-arc 即可 MRC工
iOS開發之OC 和 Swift混編
前言 相信很多開發者在開發過程中,使用別人封裝好的三方框架,但由於三方框架的開發語言(OC或者Swift)與現有工程的開發語言不一致,導致無法直接使用,那麼對於混編來說,是不二的選擇。 Swift專案使用OC框架 1. 建立橋接檔案,一般的命名規則(專案名-Br
iOS開發之weak和assign的區別
共同點: 都可以修飾物件型別的property, 不會增加其引用計數. 不同點: 1.出現時期, assign出現在ARC之前, weak出現在ARC之後; 2.可修飾的型別, assign既可
ios開發之--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffset和NSString之間的轉換
距離 轉換 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開發中alloc和new的區別
1.在實際開發中很少會用到new,一般建立物件咱們看到的全是[[className alloc] init] 但是並不意味著你不會接觸到new,在一些程式碼中還是會看到[className new], 還有去面試的時候,也很可能被問到這個問題。 2.那麼,他們兩者之間到底有什麼區別呢 我們看原始碼:
iOS開發之給navigationbar和view設定同一張圖片
###### 效果一: 今天因為這個小東西被吐槽了...但還是決定記錄一下... 其實說是給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-C和JavaScript互動詳解之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