1. 程式人生 > >隨手記今天跟的幾個iOS專案程式碼的問題

隨手記今天跟的幾個iOS專案程式碼的問題

休了一陣子假期,今天剛回來上班,專案程式碼已經有挺大的變化了,我就先體驗、發現、跟進問題。

第一個問題是點選某個cell就掛掉的現象,同事表示必現但挺神奇。由於掛掉的時候沒有啥有意義的資訊,所以先簡單粗暴地在

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

打個斷點,結果還沒命中就掛了。再一看cell的佈局,發現是在一個UITableViewCell物件的contentView上面addSubview一個由nib檔案載入進來的UI控制元件,在這個控制元件中有響應touch事件:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

很遺憾同樣還沒命中斷點就掛了,所以我嘗試增加了如下函式:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
結果很意外地發現好了。但是如果將事件傳遞給super時,依然會掛。從而定位到是上一級檢視的問題,後來發現是這麼一行程式碼:
cell.selectedBackgroundView = [[UIView alloc] autorelease];
漏掉初始化了。

第二個問題是在傳參過程中,直接將NSNumber指標賦值給BOOL變數,而不是取其boolValue。

直接用@(0)對BOOL值賦值,而不是[@(0) boolValue];

第三個問題是在UITableView的headerView上結合searchBar控制元件遇到的,在非ARC的dealloc程式碼中,掛在:
[super dealloc];

這個比較容易聯想到二次釋放,所以我直接先採用Profile工具做一次NSZombie的檢查,令人開心的是中了,令人遺憾的是沒有定位到太有價值的程式碼行。

但是可以基本推斷出跟UITableView及其headerView有一定關係。又由於場景是可以重現的,所以通過註釋掉dealloc函式裡德其它程式碼定位到是tableView釋放時引發的,但經常反覆檢查,確認沒有二次釋放,最終發現通過以下程式碼可以避免:

self.tableView.tableHeaderView = nil;

這點倒沒有完全理清楚,目前懷疑是引用searchBarController和searchBar時,一些引用技術上引發的問題。

……