靈活運用runtime改寫系統的方法

2021-07-10 08:12:18 字數 1106 閱讀 2643

ios系統的一些方法的實現效果不盡人意,例如陣列越界蘋果就會直接crash,不會像字典一樣置空,程式就會閃退,使用者體驗會很不好。有些時候陣列越界了,但我們不想讓程式崩潰。越界了,就置空,程式還能正常執行。那麼如何避免陣列越界引起的程式崩潰?改寫nsarray的objectatindex方法,然後在裡面寫一些自己的操作,但是我們並不知道系統的objectatindex是如何實現的。

整理一下思路:我們要在呼叫nsarray的objectatindex方法的時候,讓它呼叫不是系統的objectatindex方法而是乙個我們自己寫的方法。也就是說交換方法,用到runtime。

一、首先,我們建立乙個「判空」功能的nsarray的類別(關於類別,請看前面的博文),如:nsarray+jdnil.h。之後匯入runtime標頭檔案:#import "objc/runtime.h"

二、然後,我們在nsarray類的載入方法load裡面交換方法。如下:

+ (void)load

這三句話的意思是,獲得__nsarrayi類的objectatindex方法和xxf_objectatindex方法,並把兩者交換。交換之後,當呼叫objectatindex方法時,執行的是xxf_objectatindex裡面的**。

需要注意的有兩點:

1.load方法,類的載入方法。實驗證明工程啟動後就會自動呼叫load方法,不管有沒有引用標頭檔案。最先呼叫,不需要引入標頭檔案。

2.注意是__nsarrayi而不是nsarray,__nsarrayi才是真身,例如下面的陣列越界崩潰資訊中的[__nsarrayi objectatindex:]

三、實現xxf_objectatindex方法。如下:

- (id)xxf_objectatindex:(nsuinteger)index  else 

}

ios黑魔法-method swizzling

靈活運用PHP stdClass

轉 一維陣列,我現在特別喜歡把它寫成物件,因為鍵盤打起來比較順手,看起來也順眼,如 andy array andy a 1 andy b 2 andy c 3 我喜歡把它變成這樣 andy array andy object andy andy a 1 andy b 2 andy c 3 新建空陣列...

js 「 」 「 」的靈活運用

如果 左側表示式的值為真值,則返回右側表示式的值 否則返回左側表示式的值。js var i 真值 i i 真值 其他真值 i 其他真值 i 真值 i 如果 左側表示式的值為真值,則返回左側表示式的值 否則返回右側表示式的值。js var i 真值 i 真值 i 真值 其他真值 i 真值 i 真值 i...

靈活運用建構函式

示例 public class activityutils 得到activityutils的物件 public static activityutils getinstance return instance 管理activity的棧 public void add activity activit...