2012-03-05 66 views
1

這是我第一次在這裏問一些東西,所以請不要太苛刻我:-)。我有一個奇怪的「訪問不良」問題。在我的一個類中,我有一個NSInteger以及其他一些成員。我重寫- (NSString *)description方法打印一切的價值觀,像這樣(省略unrelevant部分):打印NSInteger時奇怪的BAD_ACCESS

- (NSString *)description { 
    return [NSString stringWithFormat:@"Duration:%d", duration]; 
} 

,然後我打印使用NSLog(@"%@", myObject)這是給我EXC_BAD_ACCESS沒有任何日誌消息,無論NSZombieEnabled的。

  • 我有雙重檢查所有格式說明符和 參數的順序 - 它是正確的。
  • 我試圖改變格式說明%i%@,當我初始化我的目標,我不初始化 時間沒有得到任何結果
  • 。稍後,我通過屬性@property NSInteger duration分配它。所以我試圖在我的init 方法初始化的持續時間爲0,但無濟於事。
  • 如果我在 之前打印持續時間到NSNumber,它就會起作用。
  • 當我刪除持續時間,並保留所有 其他ivars它再次工作。

我很爲難,我究竟做錯了什麼? 你能幫我嗎?

非常感謝!

編輯:概括地說,看來這是32個和64位平臺之間的差異造成的,因爲當在iPhone 4上運行,並在模擬器中運行,只有當有問題,它的罰款。我嘗試了3種不同的方法 - 使用%d%i以及NSInteger變量本身,使用%qi和使用%ld/%lx,我也嘗試使用各種格式說明符轉換爲intlong。每次我都可以在設備上運行,但在模擬器中獲得EXC_BAD_ACCESS。

+0

在你的方法設置一個brakpoint和閱讀你的「時間」的價值,我認爲當你在那裏我沒有在NSLog的設置斷點沒有設置... – 2012-03-05 11:46:08

+0

- myObject的是有效的,它有一個有效的持續時間有...謝謝馬可! – Lubo 2012-03-05 11:58:04

+0

請多發一點代碼 – Novarg 2012-03-05 12:01:19

回答

1

唯一的猜測在這裏:NSInteger可能是64位在你的情況下,%i(以及%d)期望32位整數,你可以嘗試%qi或者(似乎更好) 。

+0

嘿哥布拉,嘗試使用'%qi'和'%qu'並且也轉換爲'int',但沒有任何變化。我可以去拳擊選項,但想知道我是否在某個地方犯了一個錯誤...謝謝你的答案! – Lubo 2012-03-05 12:01:33

-1

也許你需要綜合你的財產?

+0

我已經完成了帕帕贊,我認爲這不是問題。謝謝! – Lubo 2012-03-05 11:41:46

0

當您運行在調試器中的應用程序,其中正是是信號提高嗎? Xcode會向您顯示問題的精確線路和堆棧。

當你確定崩潰發生在stringWithFormat:方法它可能是格式說明問題。 Apple的String Programming Guide contains information關於如何以安全和平臺獨立的方式處理NSInteger

+0

該信號來自'stringWithFormat:'方法。感謝您的鏈接尼古拉,我已經參考了很多次,但錯過了關於平臺依賴關係的底部。但是,當我使用'%ld'或'%lx'並且強制轉換(長)時,它只能在設備上運行(iphone 4),但在模擬器中它仍然給我一個不好的訪問權限。沒有轉換時使用'%d'或'%i'時的情況... – Lubo 2012-03-05 12:45:28