ios巨集定義學習

来源:https://www.cnblogs.com/jiuyi/archive/2019/02/18/10397464.html
-Advertisement-
Play Games

巨集簡介: 巨集是一種批量處理的稱謂。一般說來,巨集是一種規則或模式,或稱語法替換 ,用於說明某一特定輸入(通常是字元串)如何根據預定義的規則轉換成對應的輸出(通常也是字元串)。這種替換在預編譯時進行,稱作巨集展開。編譯器會在編譯前掃描代碼,如果遇到我們已經定義好的巨集那麼就會進行代碼替換,巨集只會在記憶體中co ...


巨集簡介:

巨集是一種批量處理的稱謂。一般說來,巨集是一種規則或模式,或稱語法替換 ,用於說明某一特定輸入(通常是字元串)如何根據預定義的規則轉換成對應的輸出(通常也是字元串)。這種替換在預編譯時進行,稱作巨集展開。編譯器會在編譯前掃描代碼,如果遇到我們已經定義好的巨集那麼就會進行代碼替換,巨集只會在記憶體中copy一份,然後全局替換,巨集一般分為對象巨集和函數巨集(下麵會詳細介紹)。

巨集的弊端:

如果代碼中大量的使用巨集會是的編譯時間變長。

對象巨集:

像這樣:#define M_PI 3.14159265358979323846264338327950288
這個沒什麼好講的,我想只要是個iOS程式員就都會用。
下麵附送一波我們在工程中常用的巨集

//獲取屏幕的寬和高
#define SCREEN_WIDTH   [UIScreen mainScreen].bounds.size.width
#define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height
//設置隨機顏色
#define LRRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]
//設置RGB和RGB顏色
#define LRRGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define LRRGBAColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]
// clear背景顏色
#define LRClearColor [UIColor clearColor]

//判斷是否為iPhone
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
//判斷是否為iPad
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
//判斷是否為ipod
#define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"])
// 判斷是否為 iPhone 5SE
#define iPhone5SE [[UIScreen mainScreen] bounds].size.width == 320.0f && [[UIScreen mainScreen] bounds].size.height == 568.0f
// 判斷是否為iPhone 6/6s
#define iPhone6_6s [[UIScreen mainScreen] bounds].size.width == 375.0f && [[UIScreen mainScreen] bounds].size.height == 667.0f
// 判斷是否為iPhone 6Plus/6sPlus
#define iPhone6Plus_6sPlus [[UIScreen mainScreen] bounds].size.width == 414.0f && [[UIScreen mainScreen] bounds].size.height == 736.0f
//獲取系統版本
#define IOS_SYSTEM_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
//判斷 iOS 8 或更高的系統版本
#define IOS_VERSION_8_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue] >=8.0)? (YES):(NO))
//判斷是真機還是模擬器
#if TARGET_OS_IPHONE
//iPhone Device
#endif
#if TARGET_IPHONE_SIMULATOR
//iPhone Simulator
#endif

//沙盒目錄文件
//獲取temp
#define kPathTemp NSTemporaryDirectory()
//獲取沙盒 Document
#define kPathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
//獲取沙盒 Cache
#define kPathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

//NSLog
#define NSLog(format, ...) do {                                                                          \
    fprintf(stderr, "<%s : %d> %s\n",                                           \
    [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],  \
    __LINE__, __func__);                                                        \
    (NSLog)((format), ##__VA_ARGS__);                                           \
    fprintf(stderr, "-------\n");                                               \
} while (0)
函數巨集:

其實說到巨集那麼不得不提的就是在巨集中常用的預處理命令和運算符

指令及作用:

#空指令,無任何效果
#define定義巨集
#undef取消已定義的巨集
#if如果給定條件為真,則編譯下麵代碼
#ifdef如果巨集已經定義,則編譯下麵代碼
#ifndef如果巨集沒有定義,則編譯下麵代碼
#elif如果前面的#if給定條件不為真,當前條件為真,則編譯下麵代碼
#endif結束一個#if……#else條件編譯塊
#error停止編譯並顯示錯誤信息

#運算符:
例如: #define demo1(n) "123"#n
出現在巨集定義中的#運算符把跟在其後的參數轉換成一個字元串。有時把這種用法的#稱為字元串化運算符

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",demo1(abc));
}
//列印會輸出 123abc

##運算符:
例如:#define demo2(m,n,j) m##n##j
##運算符用於把參數連接到一起。預處理程式把出現在##兩側的參數合併成一個符號

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%d",demo2(1, 2, 3));
}
//列印會輸出 123

舉例:

//巨集定義
#ifndef weakify
#define weakify(o) __weak typeof(o)  weak##o = o;
#define strongify(o) __strong typeof(o) o = weak##o;
#endif
//調用
-(void)demo2
{
    weakify(_v2)
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSInteger count =0;
        
        strongify(_v2)
        
        while( count<10) {
            
            count++;
            
            NSLog(@"---------%@---%ld",weak_v2,(long)count);
            
            sleep(1);
            
        }
    });
    
    //3秒後將 self.v2對象 銷毀
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
        self.v2=nil;
    });
}
上面定義了兩個巨集,第一個相當於實現了__weak typeof(self) weakself = self;用##把weak和self連接起來,實現了self對block的弱引用,第二個巨集的作用是保護block里的__weakself防止self被釋放後block里的 __weakself也被釋放(如果block在棧區,會將block copy一份到堆區,如果block在堆區,就在copy一份在堆區,此時block的引用計數為2)。
在上面demo2中_v2是當前類的屬性,在併發隊列線程的block中用strongify保護起來,在3秒後self.v2釋放,但由於self.v2被copy一份到堆區,所以依然可以列印_v2。

 


 




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:https://blog.csdn.net/e_wsq/article/details/7561209 步驟: 1.建立一個臨時varchar2欄位用來保存數據 2.將clob的內容截取後更新到varchar2欄位中 update table_wonder set tempcolumn = d ...
  • 複製數據表 刪除表中某個欄位 查看表結構 未完待續...... ...
  • SQL Server 查找統計信息的相關採樣信息 有時候我們會遇到,由於統計信息不准確導致優化器生成了一個錯誤的執行計劃(或者這樣表達:一個較差的執行計劃),從而引起了系統性能問題。那麼如果我們懷疑這個錯誤的執行計劃是由於統計信息不准確引起的。那麼我們如何判斷統計信息不准確呢?當然首先得去查看實際執... ...
  • 最近統計一些數據,需要按天/按小時/按分鐘來統計,涉及到一些日期的格式化,網上看了一些文章大部分都是使用 `CONVERT` 來轉換的,SQL Server 從 2012 開始增加了 `FORMAT` 方法,可以使用 `FORMAT` 來格式化日期,更標準化,更具可定製性,而且和 C# 里的日期格式... ...
  • 碰到一個樹形數據需要存儲再數據控制,碰到以下兩個問題: 在PG資料庫中如何表達樹形數據 如何有效率的查詢以任意節點為Root的子樹 測試數據 為了更加簡單一些,我們將使用一下數據 簡單的自引用 當設計自引用表(有時候自己join自己)。最簡單明瞭的就是有一個 欄位。 然後插入一些樣例數據,用 來關聯 ...
  • 當構建一個Web應用時,經常被要求加上搜索功能。其實有時候我們也不知道我要搜索個啥,反正就是要有這個功能。搜索確實很重要的特性,這也是為什麼像Elasticsearch和Solr這樣基於Lucene的資料庫越來越流行。這兩個是好用,但是在構建Web應用時,有時候感覺像是殺雞用牛刀。所以我們需要選擇輕 ...
  • 在SQL Server中,我們能否找到索引的創建時間?最後一次索引重建(Index Rebuild)的時間? 最後一次索引重組(INDEX REORGANIZE)的時間呢? 答案是我們無法準確的找到索引的創建時間、最後一次索引重組時間,最後一次索引重建的時間。 其實就目前SQL Server的各個版... ...
  • 原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要講解 ROLLUP, CUBE, GROUPING SETS的主要用法,這些函數可以理解為GroupBy分組函數封裝後的精簡用法,相當於多個union all 的組合顯 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...