2014-04-01 54 views
0

我一直在努力實現MVC到這個應用程序中我一直在教自己編程,過去幾天我一直在遇到EXC_BAD_ACCESS錯誤。我一直在閱讀,我發現調試器設置讓我發現,當我從我的控制器對象調用我的模型對象的屬性時,我被告知保留消息正在發送給已經釋放實例。我知道顯示錯誤訪問錯誤的行並不總是出現錯誤,但通過註釋行,我認爲我找到了該位置。Objective C處理屬性

我用我的AppDelegate類作爲我的控制,當按下按鈕下面的函數調用:

- (IBAction)makeChart:(id)sender { 

[self.myModel makeCodesandNamesArray:self.popupButton.indexOfSelectedItem]; 

NSLog(@"%@",[self.myModel.CodesandNames objectAtIndex:3]); 

[sender setEnabled:NO]; 

NSLog(@"Done!!");} 

在我的模型類,我有makeCodesandNamesArray方法:

-(void)makeCodesandNamesArray:(long)popvalue{ 


NSString *codesNames = [[NSString alloc] init]; 
switch ((int)popvalue) { 
    case 0: 
     codesNames = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"NEWD65Lab" ofType: @"txt"] encoding:NSUTF8StringEncoding error:NULL]; 
     break; 

    case 1: 
     codesNames = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"NEWD50Lab" ofType: @"txt"] encoding:NSUTF8StringEncoding error:NULL]; 
     break; 

    case 2: 
     codesNames = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"NEWALab" ofType: @"txt"] encoding:NSUTF8StringEncoding error:NULL]; 
     break; 
    case 3: 
     codesNames = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"NewCodesandNames" ofType: @"txt"] encoding:NSUTF8StringEncoding error:NULL]; 
     break; 
    default: 
     NSLog(@"Selection Index outside bounds of popup somehow"); 
     break; 
} 

NSArray *colorArray = [[NSArray alloc]initWithArray:[codesNames componentsSeparatedByString:@"\n"]]; 

self.CodesandNames = colorArray;} 

我有模型的頭文件中的CodesandNames的@property,我已經正確地將模型連接到控制器,據我所知。

我的錯誤出現在控制器中的NSLog中,調試器告訴我「[__NSArrayI retain]:發送到釋放實例0x1e0112200的消息」。我一直無法找到具體的實例0x1e0112200,但是當我註釋掉NSLog時,我沒有看到這個錯誤。我還在控制器操作中使用了CodesandNamesproperty作爲參數並獲得相同錯誤的其他方法調用。

似乎屬性被釋放之間定義它並試圖在NSLog中調用它,但我沒有看到任何可以做到這一點。

我也有模型中的makeCodesandNamesArray返回colorArray並將其設置爲控制器中的self.myModel,但發生同樣的錯誤。最後,當我讓makeCodesandNamesArray返回colorArray並在NSLog中調用它時,沒有錯誤,數組顯示正常。

任何有關這個問題的幫助將不勝感激,謝謝!

+0

能告訴你的變量聲明?它應該被引用強/保留,如果它很弱,數組不會被保留 – Lepidopteron

+0

是的,它是@property(分配)NSArray * CodesandNames;根據蒂亞戈的建議,我改變了它,包括將它改爲以我錯誤地沒有做過的小寫字母開頭的標準。感謝您花時間看看這個問題 – nintandrew

回答

1

您提供給我們的信息很可能是您的財產聲明中的問題。

在這種情況下,您的數組應該是一個強大的屬性。因此,請確保您聲明您的數組是這樣的:

@property(nonatomic, strong) NSArray* CodesandNames; 

欲瞭解更多有關強VS弱請檢查該answer on stackoverflow

此外請注意代碼標準。你的屬性/ iVars應該以小寫字母開頭。

最後,請允許我建議改變該交換機到這一點:

NSDictionary *popValueToCodeName = @{@(0) : @"NEWD65Lab", 
            @(1) : @"NEWD50Lab", 
            @(2) : @"NEWALab", 
            @(3) : @"NewCodesandNames"; 

if(popValueToCodeName[@((int)popValue)]) { 
    [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource: popValueToCodeName[@((int)popValue)] ofType: @"txt"] 
            encoding:NSUTF8StringEncoding 
             error:NULL]; 
} else { 
    NSLog(@"Selection Index outside bounds of popup somehow"); 
} 
+0

謝謝!我的@properties只有(分配),所以我改變了他們,字典的變化也非常感謝! – nintandrew

+0

任何時候伴侶:) –