2010-05-03 67 views
0

我是一個完全新手,所以我可能錯過了一些非常簡單的事情,但我無法讓我的字符串追加工作。我添加第三個字符來輸入數字&它崩潰 - 該方法被稱爲罰款和typedDigit將達到2個字符長。我認爲一切都在頭文件中正確聲明。代碼是 -iPhone模擬器應用程序在追加字符串時崩潰

-(IBAction)digitPressed:(UIButton *)sender { 

    NSString *digit = [[sender titleLabel] text]; // in this case, "0" - "9" 

    if (userIsInMiddleOfTyping) { // typedDigit is already at least 1 character long 
     typedDigit = [typedDigit stringByAppendingString:digit]; 
    } else {      // first character of typedDigit 
     typedDigit = digit; 
     userIsInMiddleOfTyping = YES; 
    } 

} 

非常感謝您的幫助!

回答

1

沒有崩潰的堆棧跟蹤,很難知道原因,但我的猜測是typedDigit正在您的digitPressed函數的下一個調用之前被自動釋放。 stringByAppendingString:會返回一個自動釋放對象,因此如果您希望它在下一個自動釋放池刷新過程中轉移,則需要使用retain。對於直接修復,嘗試像......比這

if (userIsInMiddleOfTyping) { 
    typedDigit = [[[typedDigit autorelease] stringByAppendingString:digit] retain]; 
} else { 
    typedDigit = [digit retain]; 
    ... 

更多,你需要確保你release typedDigit在某一點後打字結束了,你用它完成。

+0

非常感謝大家,非常感謝這樣有用的&即時答覆。通過添加必要的「保留」來排序,現在工作正常。 – SomaMan 2010-05-03 22:47:28

0

試圖附加數字時,您需要確保數字不是NULL。也沒有提及typedDigit的初始化,所以如果它是一個垃圾指針或者初始化不好,當你試圖操作它時你會崩潰。

+1

null'typedDigit'不太可能成爲問題,因爲消息到null對象在Objective C中被默默丟棄。 – 2010-05-03 22:52:47

0

我想你可能有一個所有權問題。如果typeDigit是一個對象實例變量,則應該使用setter方法進行設置。在任何情況下,你都不會在你想要保留的字符串上調用「保留」,所以它們可能會在方法調用之間的背後被釋放。