[英]Why does release build fail and not debug?
我有一個運行良好的設備/調試版本。 當我進行發行並分發到設備上時,出現以下錯誤:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UILabel setWidth:]: unrecognized selector sent to instance 0x1605a0'
它發生在cellForRowAtIndexPath中:
cell.videoName.width = 163.0;
其中cell是自定義UITableViewCell,而videoName是UILabel。 為什么調試版本可以正常工作並釋放失敗? 分發版本也失敗。 所有設置均針對基本SDK == iPhone OS 3.0。
為了在手機上發布版本,我只是將代碼簽名更改為開發人員。 我也嘗試通過iTunes建立發行版本,但由於相同的錯誤而失敗。
-編輯-
我正在像這樣加載單元格:
static NSString * QuestionCellIdentifier = @"QuestionCellIdentifier";
TopicCellController *cell = (TopicCellController *)[tableView dequeueReusableCellWithIdentifier:QuestionCellIdentifier];
if(cell == nil){
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TopicCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.videoName.width = 163.0;
在運行時,單元格為自定義類型,而videoName為nil。 如果我刪除最后一行(設置寬度),則效果很好。
---編輯:新發現---
我發現除了調用width之外,我還可以做到這一點,並且它在發布時有效:
cell.videoName.frame = CGRectMake(10, 10, 100, 30);
那真的沒有任何意義。
以我的經驗,這通常是因為在調試版本而不是發行版本中分配的內存被初始化為0x00
。 因此,在發行版中,數據結構的成員之一具有一個選擇器,該選擇器是其他選擇遺留下來的。 在調試版本中,它設置為零。
但是我不知道iPhone SDK環境是否將內存初始化為零-似乎在調試版本中更現代的開發環境0xcd
新分配的內存初始化為0xcd
而不是0x00
類的東西。
另外,您可能需要檢查此StackOverflow問題。
聽起來您要么具有一些副作用的調試代碼(使用NSLog進行跟蹤?),要么僅在較快發行版中出現了線程之間的間歇競爭狀態。
因此,我將首先檢查與調試有關的代碼,然后檢查是否有任何后台線程檢查它們是否可能影響單元。
這也可能是您的cellForRowAtIndexPath重用標識符處理中的錯誤,有時會導致無效-但是很難理解為什么這只會在發行版中發生。 如果不了解自定義單元的設置方式,則很難發表更多評論。
它應該是:
cell.videoName.frame.size.width = 163.0;
UILabel沒有width屬性,它具有帶有width字段的frame屬性。
這也是發行失敗而不是在調試中失敗的原因,是發行具有與調試不同的某些目標構建設置,請查看哪些是不同的。 通常發布會進行更多優化。 這會看到您應用中的錯誤(例如內聯代碼),默認目標中的錯誤恰好由於運氣不好而碰巧看到了內存中的好位置(或空白位置,或者恰好有一個整數,這就是您所期望的),不會引發異常,在該整數中對其進行內聯可移動代碼,以便您的錯誤現在可以訪問內存中的其他位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.