2011-03-05 120 views
0

我試圖讓這個圖形計算器工作。我有兩個視圖控制器,一個用於計算器,另一個用於圖形。分開他們工作正常。但是當我因爲某種原因推動堆棧上的圖形視圖控制器時,它不起作用。UINavigationController推送問題

這是計算的y值在顯示屏上繪製圖形

+ (double)evaluateExpression:(id)anExpression 
     usingVariableValues:(NSDictionary *)dictionaryOfVariables 
{ 
    CalculatorBrain *brain = [[CalculatorBrain alloc] init]; 
    double result = 0; 

    for (id anObject in anExpression) { 
     if ([anObject isKindOfClass:[NSNumber class]]) { 
      brain.operand = [anObject doubleValue]; 
     } else if ([anObject isKindOfClass:[NSString class]]) { 
      if ([anObject characterAtIndex:0] == '%') { 
       brain.operand = [[dictionaryOfVariables objectForKey:anObject] doubleValue]; 
      } else { 
       result = [brain performOperation:anObject]; 
      } 
     } 
    } 

    [brain release]; 
    return result;  
} 

由於某種原因,部分代碼,這個功能能正常工作的第一個五年時間的叫法,但第六次,調試器說,anObject已被釋放,我的程序崩潰(用NSZombiesEnabled確認)。 anExpression是一個帶有NSNumbers或NSStrings的NSArray。我無法理解如何或爲什麼這個數組中的東西被釋放。

這是推動GraphViewController到的UINavigationController棧的代碼,並賦予它它的屬性:

- (IBAction)graph:(UIButton *)sender 
{ 
    GraphViewController *gvc = [[GraphViewController alloc] init]; 
    gvc.graphModel.expression = [self brain].expression; 
    gvc.graphModel.scale = 30; 
    [self.navigationController pushViewController:gvc animated:YES]; 
    [gvc release]; 
} 

gvc.graphModel.expression是獲取傳遞到evaluateExpression: usingVariableValues:上面的表達式。

,這是呼籲[自腦]代碼.expression

- (id)expression 
{ 
    id anExpression = [internalExpression copy]; 
    [anExpression autorelease]; 
    return anExpression; 
} 

這是使物體進入anExpression擺在首位代碼:

- (void)addTerm:(id)anObject 
{ 
    if (!internalExpression) internalExpression = [[NSMutableArray alloc] init]; 
    [internalExpression addObject:anObject]; 
} 

注:anExpressioninternalExpressionexpression都意味着幾乎相同的東西。他們持有我想要表達的表情。

我知道這有點複雜,但我希望有人能夠至少指向正確的方向。

+1

是'anObject'公佈內任何地方'performOperation:'? – Jim 2011-03-06 01:17:38

+0

我不這麼認爲,但爲了測試你的想法,我直接給了'performOperation:'anObject'副本而不是'anObject',現在它可以工作!但是我仍然沒有看到'performOperation:'放置'anObject'的位置。 – ladookie 2011-03-06 16:18:45

回答

1

當它實際上並不擁有該對象時,最有可能釋放數組中的一個對象。

+0

我看不到它。有沒有辦法找出誰使用調試器釋放它? – ladookie 2011-03-05 21:29:36

+0

不是我所知道的。但是使用XCode中的「構建和分析」選項很有可能會爲您添加標記。 – Anomie 2011-03-05 21:37:01

+0

它沒有任何東西,謝謝。 – ladookie 2011-03-05 21:45:15

0

嘿,我認爲它是因爲你自動發佈了anExpression對象,並且調用對象沒有保留它,因此當自動釋放池最終被耗盡時,它將被釋放。這也可以解釋爲什麼它有時會起作用。

我認爲使用下面應該解決這個問題:

gvc.graphModel.expression = [[self brain].expression retain]; 
+0

我試過了,沒有運氣(表達式是graphModel中的retain @property)。它不是被釋放的數組(表達式),它是數組中正在釋放的對象。當我發送消息給數組中的一個對象時,程序崩潰。 – ladookie 2011-03-05 23:01:58

+0

這是我在調試器控制檯中得到的錯誤消息: 'GraphingCalculator [39904:207] *** - [CFString isKindOfClass:]:發送到釋放實例0x4b306b0的消息。 0x4b306b0是evaluateExpression:usingVariableValues:方法中的for-in循環中的'anObject'。 – ladookie 2011-03-05 23:05:49