iOS開發入門 ☞ OC語言·筆記八

来源:http://www.cnblogs.com/bossren/archive/2017/02/22/6428935.html
-Advertisement-
Play Games

block(代碼塊) 1.1 什麼是block block是iOS中一種比較特殊的數據類型。(可以定義變數、做形參或返回值) block是蘋果官方特別推薦使用的數據類型,應用場景比較廣泛 動畫 多線程 集合遍歷 網路請求回調 動畫 多線程 集合遍歷 網路請求回調 在多線程和網路也使用得相當頻繁,一般 ...


block(代碼塊)

1.1 什麼是block

  • block是iOS中一種比較特殊的數據類型。(可以定義變數、做形參或返回值)
  • block是蘋果官方特別推薦使用的數據類型,應用場景比較廣泛
    • 動畫
    • 多線程
    • 集合遍歷
    • 網路請求回調

      在多線程和網路也使用得相當頻繁,一般都是作為回調使用!

  • block的作用
    • 和函數一樣,用來保存某一段代碼,可以在恰當的時間再取出來調用
    • block功能類似於函數(方法),比函數更強大。
    • block是一種數據類型,可以嵌套定義,隨時調用。

Xcode輸入 inline 可快速生成(快捷鍵)

1.2 block的格式    

  

  • 比較函數、函數指針、block:

       

    如果block沒有參數, 那麼^後面的()可以省略

  • block案例

1.3 給block類型取別名(類比函數指針)

     

變數的名稱就是類型名稱(即別名)

     

1.4 block的應用場景

   當前面代碼塊一樣,後面代碼塊一樣,中間的代碼塊不一樣,中間的代碼塊就用block。

    

1.5 block的註意事項

  • block中可以定義和外界同名的變數,但是在block中訪問的是block中定義的變數(就近原則,和函數一樣)

     

  • 在代碼塊中可以訪問外面的變數

    (1)在代碼塊中可以直接訪問和修改非棧區的變數(使用的是同一個變數)

 

      

    (2)棧區的變數可以訪問,但預設不能修改(使用的是不同的變數,實際上訪問的是自己拷貝的值)

        block中的變數和外界的局部變數並不是同一個變數,block會將外界的變數拷貝一份到堆記憶體中

        block中使用的外界變數是copy,所以在調用之前修改外界變數的值,不會影響到blockcopy的值

      

    (3)在代碼塊中修改局部變數編譯不通過。怎麼在代碼塊中修改局部變數呢?在局部變數前面加上關鍵字:__block

         

  

1.6 面試題:block是存儲在堆中還是棧中?

  • 預設情況下block存儲在棧中,如果對block進行一個copy操作,block會轉移到堆中
  • 如果block在棧中, block中訪問了外界的對象, 那麼不會對對象進行retain操作
  • 如果block在堆中, block中訪問了外界的對象, 那麼會對外界的對象進行一次retain

    

1.7 block的記憶體泄露體現

block在copy時都會對block內部用到的對象進行強引用(ARC)或者retainCount增1(非ARC)。

在ARC與非ARC環境下對block使用不當都會引起迴圈引用問題。

一般表現為:

  某個類將block作為自己的屬性變數,然後該類在block的方法體裡面又使用了該類本身,簡單說就是

     

    

1MRC情況下,用__block可以消除迴圈引用。

2ARC情況下,必須用弱引用才可以解決迴圈引用問題,iOS5之後可以直接使用__weak,之前則只能使用__unsafe_unretained了,__unsafe_unretained缺點是指針釋放後自己不會置空。

 

什麼時候棧上的Block會複製到堆呢?

  • 調用Block的copy實例方法時
  • Block作為函數返回值返回時
  • 將Block賦值給附有__strong修飾符、id類型的類或Block類型成員變數時
  • 在方法名中含有usingBlock的Cocoa框架方法或GCD的API中傳遞Block時

     

    block很多的用處是跨越兩個類來使用的。

    實現兩個頁面之間的傳值:

  • 通過“協議/代理”實現兩個頁面之間傳值
  • 使用block作為property,實現兩個頁面之間傳值

 

面試題:

    

 


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

-Advertisement-
Play Games
更多相關文章
  • 使用微信APP的小伙伴對於微信的ActionBar一定有印象,今天就帶領大家一起實現以下這個效果。 第一步打開我們的開發工具,這裡我使用的是Eclipse+ADT插件,然後創建我們的工程,這裡選擇Android的最低版本號為3.0或以上。 然後開始我們的"抄襲",首先打開我們微信,我們看到,頂部標題 ...
  • 總體來講基本所有軟體都繞不開更改顏色這種事兒。 廢話不多說,開始添加背景顏色 1.先創建工程項目 2.修改ViewController.m(註意大小寫區分) 3.創建一個gray的名字的顏色類調用方法輸入代碼 4.測試圖如下 5.分析一下插入的代碼 Objective-C是面相對象的語言,所以對象是 ...
  • 引言:Xcode8 之後引用Automatic manage signing 。對於開發者而言,在證書上栽的坑肯定不少。 準備:1.開發者賬號是必須的吧。 2. Xcode設置account (不給Xcode說你的賬號,怎麼找你的證書和app信息) 3.開發者賬號,如圖依次次設置,具體設置內容簡單說 ...
  • 問題:上傳頭像成功後,頭像的url沒變,載入頭像時還是從緩存中根據url載入以前的圖片。 這個問題,很多人遇到過。也受到很多同行的啟發。 圖片url不變,感覺不是很合理,這樣會把緩存搞亂。 但是,作為程式員,我還是得好好想想改怎麼解決這個問題。 1.既然是緩存引起的問題,那我首先考慮的是清除緩存。 ...
  • 代理設計模式 Demo 一、讓別人幫我做事 —— 基本版 二、讓別人幫我做事 —— 引入協議 三、讓別人幫我做事 —— 規範完整版 ...
  • 由OpenDigg 出品的安卓開源項目周報第九期來啦。我們的安卓開源周報集合了OpenDigg一周來新收錄的優質的安卓開源項目,方便安卓開發人員便捷的找到自己需要的項目工具。 ...
  • 前言: 實現非同步下載apk文件 並 安裝。(進度條對話框顯示下載進度的展現方式) 涉及技術點: 1、ProgressDialog 進度條對話框 用於顯示下載進度 2、AsyncTask 非同步任務的使用 耗時操作不能再主線程中進行 安卓開發_淺談AsyncTask 3、File 文件相關操作 將文件的 ...
  • 工具 常見的反編譯工具我已經放到開源中國了,大家可以自行下載。 http://git.oschina.net/zyj1609/AndroidReverseProject 博客 這裡引用郭神的大作: Android安全攻防戰,反編譯與混淆技術完全解析(上) Android安全攻防戰,反編譯與混淆技術完 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...