對cocoa的一些api的異常處理

2021-06-22 08:21:40 字數 2527 閱讀 6850

有時在使用系統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 用在函式內,後面跟一或多個函...