有時在使用系統api時會發生崩潰,但是又很難避免,這時可以對該api進行hook來統一處理。以下對一些目前自己專案中遇到的情況進行總結。
+ (void)hookmethedclass:(class)class hooksel:(sel)hooksel originalsel:(sel)originalsel myselfsel:(sel)myselfsel
這個介面是自己封裝的以後方便新增新的hook
#pragma mark -hookaddsubview
+ (void)hookaddsubview
- (void)addsubviewmyself:(uiview *)view
else
}- (void)addsubvieworiginal:(uiview *)view
使用巨集可以讓在非外發版的時候及時發現崩潰,便於解決問題。
2.字典的建構函式:object和key都不能為nil
#pragma mark -hookdictionaryinitwithobjectsforkeyscount
+ (void)hookdictionaryinitwithobjectsforkeyscount
- (instancetype)originalinitwithobjects:(const id )objects forkeys:(const id )keys count:(nsuinteger)cnt
- (instancetype)myselfinitwithobjects:(const id )objects forkeys:(const id )keys count:(nsuinteger)cnt
}return [self originalinitwithobjects:objects forkeys:keys count:cnt];
}
3.字典新增和置換key value。
#pragma mark -hookdictionarysetobjectforkey
+ (void)hookdictionarysetobjectforkey
- (void)originalsetobject:(id)anobject forkey:(id )akey
- (void)myselfsetobject:(id)anobject forkey:(id )akey
return [self originalsetobject:anobject forkey:akey];
}
4.陣列新增元素
#pragma mark -hookarrayinsertobjectatindex
+ (void)hookarrayinsertobjectatindex
- (void)originalinsertobject:(id)object atindex:(nsuinteger)idx
- (void)myselfinsertobject:(id)object atindex:(nsuinteger)idx
return [self originalinsertobject:object atindex:idx];
}
5.讀取陣列元素越界
#pragma mark -hookarrayobjectatindex
+ (void)hookarrayobjectatindex
- (id)originalobjectatindex:(nsuinteger)index
- (id)myselfobjectatindex:(nsuinteger)index
return [self originalobjectatindex:index];
}
#pragma mark -hookmutablearrayobjectatindex
+ (void)hookmutablearrayobjectatindex
- (id)originalmutableobjectatindex:(nsuinteger)index
- (id)myselfmutableobjectatindex:(nsuinteger)index
return [self originalmutableobjectatindex:index];
}
為何要hook兩次?因為nsarray是類簇
7.陣列新增元素
#pragma mark -hookmutablearrayaddobject
+ (void)hookmutablearrayaddobject
- (void)originalmutableaddobject:(id)index
- (void)myselfmutableaddobject:(id)object
對C 異常一些深入的討論
異常 1.goto,break,return,continue和異常 在try塊內部,goto,break,return,continue 可以用來轉移程式流程,當這種情況發生時,在try塊內宣告的所有變數都會被釋放掉.cpp lab try catch catch 在上面的例子中,當goto語句執...
物件的一些API
object.getprototypeof obj object.create obj 建立乙個空物件並把空物件的原型指向obj object.getownpropertydescriptor obj,屬性名 返回乙個新物件與原來的屬性標籤沒有了聯絡 object.getownpropertynam...
異常的一些筆記
package 異常 自定義異常 繼承exception 原因 異常體系有乙個特點,異常類和異常物件都要被丟擲,因為他們都具備可拋性 而 這個可拋性是 throwable體系中的獨有特點 只有還這個體系中的類和物件才可以被 throws 和 throw 操作 throw 用在函式內,後面跟一或多個函...