簡體   English   中英

為什么發布版本會失敗而不進行調試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM