我一直在努力實現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中調用它時,沒有錯誤,數組顯示正常。
任何有關這個問題的幫助將不勝感激,謝謝!
能告訴你的變量聲明?它應該被引用強/保留,如果它很弱,數組不會被保留 – Lepidopteron
是的,它是@property(分配)NSArray * CodesandNames;根據蒂亞戈的建議,我改變了它,包括將它改爲以我錯誤地沒有做過的小寫字母開頭的標準。感謝您花時間看看這個問題 – nintandrew