2011-10-05 87 views
1

我是一個初學者,建立一個計算器來熟悉ObjC。下面的代碼運行時,iOS應用程序崩潰

到目前爲止我的代碼運行正常,除了下面的代碼。

此功能鏈接到5個按鈕。

問題是,當我第一次按任何按鈕時,代碼完美無瑕地運行,第二次也如此,但是第三次​​跌倒。它總是第三次失敗。在第三次按屏幕上,按鈕本身消失並編程失速,然後崩潰。

-(void) displayOnScreenValue{ 
[mainDisplay setText:onScreenTextValue]; 
} 

-(void) pressOperatorButton:(id)sender{ 

    UIButton *pressedOpp = (UIButton *)sender; 

    onScreenValue = [onScreenTextValue doubleValue]; //onScreenValue is Double 

if (!opJustSet) { 

    switch (opSelected) { 
     case 0: //Equal 
      //mainDisplay.text = @"="; 
      accuValue = onScreenValue; 
      break; 
     case 1: //Plus 
      //mainDisplay.text = @"+"; 
      accuValue = accuValue + onScreenValue; 

      break; 
     case 2: //Minus 
      //mainDisplay.text = @"-"; 
      accuValue = accuValue - onScreenValue; 
      break; 
     case 3: //Multiply 
      //mainDisplay.text = @"x"; 
      accuValue = accuValue * onScreenValue; 
      break; 
     case 4: //Divide 
      //mainDisplay.text = @"d"; 
      accuValue = accuValue/onScreenValue; 
      break; 

     default: 
      break; 
    } 
    NSNumber* value = [NSNumber numberWithDouble:accuValue]; 
    onScreenTextValue =[value stringValue]; 
    [self displayOnScreenValue]; 
    opJustSet = YES; 
    [value release]; 

} 

signChangeSet = NO; 
dotUsed = NO; 
decimalValue = 0; 
opSelected = pressedOpp.tag; 

//[self displayOnScreenValue]; 
[pressedOpp release]; 
} 

回答

5

在此代碼:

NSNumber* value = [NSNumber numberWithDouble:accuValue]; 
onScreenTextValue =[value stringValue]; 
[self displayOnScreenValue]; 
opJustSet = YES; 
[value release]; 

你不應該釋放價值。如果您調用了alloc,複製方法 或者您調用了retain,則只需要釋放它。大多數消息返回一個將被自動釋放的對象。

同去的這個

[pressedOpp release]; 

刪除它 - 你沒有的Alloc pressedOpp(或保留它)

另外,我不知道是什麼onScreenTextValue是,但它可能應該是(保留)的@property。如果是這樣,你需要像這樣訪問:

self.onScreenTextValue = [value stringValue]; 

爲了得到自動固定(在Objective-C self.name和名稱是不一樣的事情 - 第一個使用屬性,第二個是原材料訪問字段,它繞過設置器產生的)

  1. 熟悉引用計數語義

    http://www.loufranco.com/blog/files/managing-memory-iphone.html

  2. - 或者 - 升級到最新的Xcode並使用自動引用計數。

另一個簡單的事情就是總是運行「構建和分析」,並確保解決每一個問題。它非常擅長查找不正確的版本(實際上,這個代碼就是自動引用計數的後面)

+0

onScreenTextValue是一個NSString。目前我在SL上使用Xcode 4.02。目前我沒有任何發佈的「構建和分析」 – Magpro

+0

添加此。onScreenTextValue給我「使用未聲明的標識符'這個'」 – Magpro

+0

謝謝,我只是刪除值和pressedOpp發佈,並且一切工作正常。再次感謝 – Magpro

1

您沒有正確管理內存。例如,代碼

onScreenTextValue =[value stringValue]; 

使用自動發放值分配給字段。您應該始終保留字段並在以後發佈。

此外,你正在釋放value,這是自動釋放。這意味着當自動釋放池耗盡時(通常在事件循環期間)它將被雙重釋放。

+0

正如我所說,我是一個初學者。 onScreenTextValue是一個NSSTring *。什麼是寫它的正確方法? – Magpro