ios常見的幾種傳值方式

在IOS裏,常見的傳值方式,我一般是分爲確定執行順序的傳值和不確定執行順序的傳值。

確定執行循序的傳值,比如對象A創建對象B,然後A把值賦給B,然後B在指定的順序裏對這個值進行處理。

實際例子,ViewController之間的傳值,vc1創建vc2,然後vc2.vaule = vc1.vaule 然後navigationController調用push方法,把vc2壓入棧裏,vc2馬上在viewDidLoad方法裏呈現這個value

不確定執行循序的傳值,比如對象A創建對象B,還是A把值付給B,但是不馬上對這個值進行處理,等到特定情況下,纔對這個值進行處理。這裏的特定情況,可以是頁面要消失,可以是按鈕被點擊,可以是某個時間點觸發,等等。

實際例子,還是兩個ViewController,vc1上放一個label,顯示請付款,然後vc1創建vc2,vc1把值賦給vc2,但是這個值不馬上使用,而是等vc2上有個按鈕,被點擊了之後才使用,然後調用push方法,vc2入棧。


接下來說一下常見的傳值方式:

常用於處理確定執行順序的傳值:屬性傳值(這裏把block拆出去了)

屬性傳值,這就沒啥好說的了,比如vc2.orderList = vc1.orderList,在MRC下要注意retain,還是copy,ARC下就只有strong了。常見的錯誤就是執行循序了,經常有人在vc2重寫init方法,然後直接在init方法裏使用orderList,然後在vc1裏寫,vc2 = [[vc2 alloc]init]; vc2.orderList = vc1.orderList; 結果發現怎麼用這個值都是空的。init方法裏,值都還沒傳過來,怎麼用?

常用於處理不確定執行順序的傳值:代理傳值,block傳值

代理傳值,很多人喜歡說什麼委託者,代理者,我一般是說,A創建B,B在某一個時刻把值傳給A。原理就是B有一個屬性是A,然後讓A去幹一些事。具體是什麼事,由他們倆籤的協議protocol決定。 這裏需要注意的是,B在用A這個屬性調方法的時候,要先判斷A是否指向nil,並且A是否能執行這些方法。還有一個需要主意的是delegate的屬性,一般爲assign,防止循環應用。這裏就不細說了,網上講委託代理的文章一大堆。

block傳值,block傳值說起來也算是屬性傳值的一種,只是這個屬性傳值,傳的值比較特殊,類似於傳遞函數指針,然後我們在特定情況下,比如網絡請求收到響應,把這個函數指針拿出來調用函數。這樣就達到傳遞代碼片段的目的。block傳值有兩個常見的坑,一個是沒有判斷block這個屬性是否指向nil直接拿過來調用,如果這個時候block爲nil,會直接crash。第二個坑是循環引用,兩個對象互相持有,誰也釋放不了誰,所以一般傳值進block的時候先轉weak,等到block裏的時候再轉strong。

都適用的:單例傳值,通知傳值

單例傳值,單例傳值的話,有點類似全局變量,單例本質就是程序運行的時候,這塊內存空間一直不釋放,有什麼值就在這塊內存空間讀寫。

通知傳值,一般是用在,我不確定什麼時候,有誰需要去執行。比如我有3個頁面都是顯示未付款,這個時候網絡請求響應付款成功,我需要三個頁面都變成已付款。那就在需要改變狀態的3個頁面註冊觀察者,讓他們監聽某一事件,然後在網絡請求那邊post消息出去,這3個觀察者都是接到。通知傳值有個坑就是,觀察者用完要銷燬。還有就是相對於代理而言,會比較消耗系統資源。

常見的幾種傳值方式就講到這裏。。以後再慢慢補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章