某天,開(kāi)發(fā)小王:來(lái)幫忙看下,為什么我的按鈕樣式變了,我什么代碼都沒(méi)改。源碼調(diào)試沒(méi)問(wèn)題,二進(jìn)制組件工程有問(wèn)題。
看了下代碼,按鈕的生成是一個(gè)工廠方法,通過(guò)傳入不同的枚舉值(比如:BUTTON_STYLE_DELETE)返回不同的按鈕樣式,方法的實(shí)現(xiàn)在一個(gè)基礎(chǔ)組件A中,出問(wèn)題的組件B依賴(lài)了這個(gè)基礎(chǔ)組件A。其中枚舉定義示例如下:
typedef NS_ENUM(NSUInteger, BUTTON_STYLE) {
BUTTON_STYLE_DEFAULT,//默認(rèn)
BUTTON_STYLE_FAV ,//收藏
BUTTON_STYLE_DELETE,//刪除
BUTTON_STYLE_ADD,//加
};
以上代碼可能出問(wèn)題的也就是枚舉值了,查看了下這個(gè)基礎(chǔ)組件的提交記錄后發(fā)現(xiàn) BUTTON_STYLE_DELETE前面被插入了新的值 BUTTON_STYLE_BACK:
typedef NS_ENUM(NSUInteger, BUTTON_STYLE) {
BUTTON_STYLE_DEFAULT,//默認(rèn)
BUTTON_STYLE_FAV ,//收藏
BUTTON_STYLE_BACK,//返回
BUTTON_STYLE_DELETE,//刪除
BUTTON_STYLE_ADD,//加
};
造成在組件A中 BUTTON_STYLE_DELETE值變成了3,而組件B中的 BUTTON_STYLE_DELETE值還是2。枚舉值在組件B被編譯成靜態(tài)庫(kù)時(shí)就已經(jīng)被賦值了,還是之前的值。所以獲取到的按鈕樣式自然有問(wèn)題。所以在組件化工程中特別是公共組件對(duì)枚舉做增刪操作時(shí)一定不要改變?cè)械闹?。在組件化工程中除了枚舉這種編譯期賦值,還有在預(yù)編譯期賦值的, 如宏定義也是經(jīng)常出問(wèn)題的地方,比如公共組件更改了宏定義的值,依賴(lài)的組件也需要重新打包。