Это действительно крутит мой разум ... Я пытаюсь получить доступ к NSMutableArray в IBAction, который я определил в viewDidLoad. К сожалению, я продолжаю получать EXC_BAD_ACCESS.iPhone SDK: NSMutableArray подсчитывает причины EXC_BAD_ACCESS
Я новичок во всем этом, поэтому я очень благодарен за понимание того, что я делаю неправильно.
Ниже вы найдете соответствующие фрагменты кода.
CounterViewController.h:
@interface CounterViewController : UIViewController{
NSMutableArray *countHistoryArray;
}
@property(nonatomic, retain) NSMutableArray *countHistoryArray;
CounterViewController.m:
@implementation CounterViewController
@synthesize countHistoryArray;
- (void)viewDidLoad {
[super viewDidLoad];
//Fill array with some dummy data
self.countHistoryArray = [[NSMutableArray alloc] init];
NSDate *now = [[[NSDate alloc] init] autorelease];
CurrentCount *historicCount = [[[CurrentCount alloc]
initWithCount:[NSNumber numberWithInteger:22]
description:@"Testcount"
dateAndTime:now] autorelease];
[self.countHistoryArray addObject: historicCount];
//Do some logging - everything is working fine here!
NSLog(@"%@", [self.countHistoryArray description]);
}
//Later on we click on a button and want to use the array
- (IBAction)doSomeStuff {
//Let's look at the array again - and now it crashes with EXC_BAD_ACCESS
NSLog(@"%@", [self.countHistoryArray description]);
}
Спасибо большое!
Manuel
EDIT Дополнительный код, как просил на @jamapag
CurrentCount.h
#import <Foundation/Foundation.h>
@interface CurrentCount : NSObject {
NSNumber *counterLevel;
NSString *description;
NSDate *dateAndTime;
}
- (id)initWithCount:(NSNumber *)newCounterLevel description:(NSString *)newDescription dateAndTime:(NSDate *)newDateAndTime;
@property(nonatomic, copy) NSNumber *counterLevel;
@property(nonatomic, copy) NSString *description;
@property(nonatomic, copy) NSDate *dateAndTime;
@end
CurrentCount.m
#import "CurrentCount.h"
@implementation CurrentCount
@synthesize counterLevel;
@synthesize description;
@synthesize dateAndTime;
- (id)initWithCount:(NSNumber *)newCounterLevel description:(NSString *)newDescription dateAndTime:(NSDate *)newDateAndTime{
self = [super init];
if(nil != self){
self.counterLevel = newCounterLevel;
self.description = newDescription;
self.dateAndTime = newDateAndTime;
}
return self;
}
-(void) dealloc{
self.counterLevel = nil;
self.description = nil;
self.dateAndTime = nil;
[super dealloc];
}
@end
Я думаю, проблема в другом месте, где-то между двумя вызовами. Однако этот код имеет утечку в 'self.countHistoryArray = [[NSMutableArray alloc] init]' - вы «распределяете» массив, аксессор свойств будет «сохранять», но вы не «выпускаете». Вы должны либо назначить напрямую на ivar, либо добавить 'autorelease'. Вероятно, стоит проверить другие сомнительные применения 'self.countHistoryArray = ...', которые могут вызвать проблемы. – walkytalky
Я делаю '- (void) dealloc {[self.countHistoryArray release];}', который, я думаю, выполняет эту работу. Я ошибаюсь? – sprain
В '-dealloc' вы должны либо вызывать' -release' на самом ivar: '[countHistoryArray release]', либо вы должны установить свойство в nil, которое освободит все, что было ранее сохранено в ivar, имея точно тот же эффект: 'self.countHistoryArray = nil'. Я предпочитаю вторую технику лично. –