iPhone SDK: счетчик NSMutableArray вызывает EXC_BAD_ACCESS - PullRequest
2 голосов
/ 02 августа 2010

Это действительно искажает мои мысли ... Я пытаюсь получить доступ к NSMutableArray в IBAction, который я определил в viewDidLoad.К сожалению, я продолжаю получать 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]);
}

Большое спасибо!
Мануэль


РЕДАКТИРОВАТЬ Дополнительный код, запрашиваемый @ 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

Ответы [ 4 ]

10 голосов
/ 02 августа 2010

Вы уверены, что ваш код на самом деле выглядит так?

- (IBAction)doSomeStuff {  
    //Let's look at the array again - and now it crashes with EXC_BAD_ACCESS
    NSLog(@"%@", [self.countHistoryArray description]);
}

В заголовке вашего вопроса написано "NSMutableArray count вызывает EXC_BAD_ACCESS" - если эта строка кода на самом деле говорит NSLog(@"%@", [self.countHistoryArray count]);, вы почти наверняка получите сбой, поскольку NSLog попытается обработать примитивный тип (тип, возвращаемый -[NSArray count]) как объект. Чтобы использовать -[NSArray count] в NSLog, используйте %u вместо %@:

- (IBAction)doSomeStuff {  
    // This time it should work!
    NSLog(@"Array Count = %u", [self.countHistoryArray count]);
}
0 голосов
/ 23 мая 2014

Я знаю, что этот вопрос уже решен и принят, но он предназначен для тех, кто сталкивается или столкнется с этой проблемой.

Я столкнулся с той же проблемой, я пробовал все решения, но ни одно решение не помогло мне.Проект, над которым я работаю, это NON-ARC.

Я попытался и сделал простое изменение свойства

Ранее мое свойство для NSMUTABLEARRAY было

@property (nonatomic, assign) NSMutableArray * dataArray;

Я изменил егона:

@property (nonatomic, retain) NSMutableArray * dataArray;

Изменил его с ASSIGN на RETAIN

И это решило мою проблему

0 голосов
/ 02 августа 2010

Похоже, вы случайно выпустили countHistoryArray где-то.Попробуйте удалить все звонки, кроме тех двух, которые вы показали.Кроме того, вы можете попытаться включить зомби для устранения проблемы.

Да, и, кстати, вы, вероятно, не очень хотите открытое свойство NSMutableArray, и если вы действительно хотите, чтобы оно было скопировано, не сохраняйте.В противном случае инкапсуляция как бы уходит в канализацию.

0 голосов
/ 02 августа 2010

Удалить авто-релиз из:

currentCount *historicCount = [[[CurrentCount alloc] initWithCount:[NSNumber numberWithInteger:22] description:@"Testcount" dateAndTime:now] autorelease];

...