1. 程式人生 > >個人對於OC中delegate、block的簡單理解

個人對於OC中delegate、block的簡單理解

(1)delegate

解決物件物件間通訊問題的關鍵:判斷誰是代理物件,誰是被代理物件。
    誰產生事件,就是被代理物件。被代理物件有一個delegate屬性,並且在這個類裡面定義一個protocol及其方法並且呼叫`,注意只是定義和呼叫,具體實現在下面的類裡面。 定義的時候要注意用assign,如果用strong會出現記憶體洩漏:VC—>view—>tableView—>delegate(self即VC)
    誰響應事件,就是代理物件。代理物件需要遵守協議,並且實現協議裡面規定的方法

(2)block

解決物件物件間通訊問題的關鍵:判斷誰回撥block,誰傳遞block (類似於delegate)
    誰產生事件,誰就回調block。這個需要回調block的類需要定義block並且有一個block屬性(定義block屬性時需要用copy)。
誰響應事件,誰就傳遞block。接受到事件傳遞block時,block裡面的具體操作在這裡定義,但在傳遞時不會執行,執行是在上面回撥block時block執行

(3)定義block屬性需要用copy的原因

 Block儲存在棧區,棧區的特性是當一個方法執行完成之後裡面的記憶體就會釋放掉,如果block被釋放,那麼後面回撥就會遇到問題,所以要把block複製到堆區來儲存。所以用copy把整個block內容拷貝過來並且在堆區新建一塊空間來儲存block

(4)__block關鍵字的使用

首先,如果要在block內部修改區域性變數,需要用__block修飾。當然被此關鍵字修飾的指標仍然是強指標,為了避免迴圈引用,修改前需要用__weak重新定義一個弱指標。例如
__weak typeof(self) weakSelf = self;
  [yourBlock:^(NSArray
*repeatedArray, NSArray *incompleteArray) { [weakSelf doSomething]; }];

(5)幾種通訊方式的對比

    通知:“一對多”,在APP中,很多控制器都需要知道一個事件,應該用通知;

delegate:
1.“一對一”,對同一個協議,一個物件只能設定一個代理delegate,所以單例物件就不能用代理;
2.代理更注重過程資訊的傳輸:比如發起一個網路請求,可能想要知道此時請求是否已經開始、是否收到了資料、資料是否已經接受完成、資料接收失敗
block:
1.寫法更簡練,不需要寫protocol、函式等等
2.block注重結果的傳輸:比如對於一個事件,只想知道成功或者失敗,並不需要知道進行了多少或者額外的一些資訊
3.block需要注意防止迴圈引用:

相關推薦

個人對於OCdelegateblock簡單理解

(1)delegate 解決物件物件間通訊問題的關鍵:判斷誰是代理物件,誰是被代理物件。 誰產生事件,就是被代理物件。被代理物件有一個delegate屬性,並且在這個類裡面定義一個protoc

個人對於JavaScriptNumber.toFixed()方法的理解

需求:對浮點數進行四捨五入精度獲取。 問題:直接使用Number.toFixed()會出現異常的舍入情況。 原因:計算機浮點數儲存是二進位制,js的Number.toFixed()實際的精度確認規則是四捨六入五成雙,逢四下舍,逢六入一,逢五時,根據瀏覽器核心計算結果也不盡相同。

Word文件方框輸入“√”“×”的簡單方法,絕對讓你相見恨晚!

在編輯Word文件時有一些小白就像小編才開始的時候用拼音打出“√”、“×”,這樣不僅顯的沒技術含量而且如果遇到在方框中輸入“√”、“×”,就徹底沒辦法了,但是不要害怕,小編今天就交大家一個非常有技術含量的方法,一起來看看吧。 1.ALT+數字鍵 按住alt鍵不放,然後輸入數字9745就會出

CUDAgridblockthreadwarp與SMSP的關係

首先概括一下這幾個概念。其中SM(Streaming Multiprocessor)和SP(streaming Processor)是硬體層次的,其中一個SM可以包含多個SP。thread是一個執行緒,多個thread組成一個執行緒塊block,多個block又組成一個執行緒網格grid。 現在

對於springIOC和AOP的理解及程式碼簡單實現

IoC(Inversion of Control): 在傳統的java程式編寫中如果呼叫方法或類者,必須要對被呼叫者進行例項化,即必須要通過new 被呼叫者類,才能對被呼叫者類中的方法、成員進行操作。在開發某一個專案時必然會出現很多類來完善專案的需求,並且類與類

機器學習筆記之七——邏輯迴歸簡單推導softmax簡單理解以及sklearn邏輯迴歸常用引數解釋

邏輯迴歸 對邏輯迴歸的理解:對線性迴歸的假設函式的 f(x) 又套上了一層sigmoid函式,即g(f(x)). 然後sigmoid函式是長這樣的: 它的影象長這樣: 對於線性迴歸得到的結果,再經過一層sigmoid函式,以x=0為界限,左邊為0,右邊為1,邏輯迴歸就是這樣一個二分類

OCnilNilNULLNSNULL的一些區別

雖然我們平常接觸的最多的是nil,但是如果對Nil、NULL、NSNULL、nil之間的還是傻傻分不清楚的話,沒準哪天“陰溝裡就翻船了”。(ps:其實我也是今天將這團亂麻理順) nil、Nil nil在Swift中表示的是值缺失,而在OC中它所代表的

iOS 物件之間的通訊方式(delegateblockNSNotificationkvckvo)總結

有五種方式:delegate(代理)、block(程式碼塊)、NSNotification(通知)、kvc(鍵-值編碼)、kvo(​鍵值觀察模式) 1. delegate:代理是一種設計模式,它是通過被代理者定義代理協議委託代理者實現協議,用於兩個物件間的通訊互動。在

OC陣列字典的遍歷的三種方法

<span style="white-space:pre"> </span> NSArray * array = @[@"中國",@"俄羅斯",@"印度"]; //1、列舉器 NSEnumerator

OCassigncopy retain等關鍵字的含義

copy:建立一個索引計數為1的物件,然後釋放舊物件 對NSString 對NSString 它指出,在賦值時使用傳入值的一份拷貝。拷貝工作由copy方法執行,此屬性只對那些實行了NSCopying協議的物件型別有效。更深入的討論,請參考“複製”部分。 retain:釋放舊的物件,將舊物件的值賦予輸入物件,再

python裝飾器的簡單理解

裝飾器 裝飾器也屬於閉包的一種 #裝飾器是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、效能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函式中與函式功能本身無關的雷同程式碼並繼續重用。概括的講,裝飾器的作用就是為

對於MySQL的子查詢的理解

每天記錄一下自己的心得體會,今天寫一下MySQL中的子查詢,個人感覺子查詢的難度比之前學的查詢都比較難,可能是語句太多吧,對於初學者的難度會有一點,反正我第一次接觸的時候是崩潰的,因為·程式碼有點多,因為內容比較多,所以小弟要是有講的不到位的,希望各位在下面給出

個人對於氣泡排序和選擇排序的理解

1.氣泡排序:它的實現原理節省了時間, 實現原理:一組數兩兩進行比較,然後把最大數放在後邊,這樣每次迴圈結束都會少一次比較, /*  * 氣泡排序  */ public class C {

理解javascriptthis的指向(簡單理解篇)

先列舉幾種常用的this指向: // 全域性下this=windowconsole.log(this==window);this.a = 1;console.log(window.a);// 物件屬性上函式的this指向的是物件objvar obj = {a:1,sayA

對javapublicstatic的理解

首先是public  在說明這四個關鍵字之前,我想就class之間的關係做一個簡單的定義,對於繼承自己的class,base class可以認為他們都是自己的子女,而對於和自己一個目錄下的classes,認為都是自己的朋友。 1、public:public表明該資料成員、成員函式是對所有使用者開放的,所有使用

對於結構體指標+-常數的理解(page_to_pfn和pfn_to_page)

昨天筆試也有這麼道題目,int arrayTmp[10] = {0};int nTmp = &arrayTmp[4]-&arrayTmp[0];問nTmp = ?當時想也沒想寫了nTmp = 16;回家在機器上除錯運行了一下,結果nTmp=4。因為不常用這種

對於react-thunk中介軟體的簡單理解

前言 剛來公司的時候,對react專案中的thunk中介軟體的作用一直不太瞭解,最近有時間決定好好研究一下。鑑於本人初次寫部落格,並已假設讀者已掌握redux的一些基本用法;如有錯誤,還望指出。不勝感激! 首先簡單回顧一下redux工作流程 圖畫的不太好,見諒;

OC對於屬性的總結(@property)

sar 版本號 來講 ret ado ews -a sco retain 在沒有屬性之前: 對成員變量進行改動都要用到設置器:setter來改動 Person *per =[[Person alloc] init]; 對象通過設置器

javaStringStringBuffer和StringBuilder的區別(簡單介紹)

情況 string 建議 code serializa 就是 同步 安全性 之間 簡單介紹 java中用於處理字符串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder

C# delegateeventActionFunc

區別 深入 展現 委托 spa 解惑 屬於 func 時間 緣起:   之前一直很糾結C#中(delegate、event、Action、Func)的用法,這麽多方法,感覺每次使用的時候好像都沒啥區別,老感覺微軟有多此一舉之嫌,不過今天花了點時間好好研究了下,才發現他們實質