2010-08-02 2 views
2

Это действительно крутит мой разум ... Я пытаюсь получить доступ к 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 
+0

Я думаю, проблема в другом месте, где-то между двумя вызовами. Однако этот код имеет утечку в 'self.countHistoryArray = [[NSMutableArray alloc] init]' - вы «распределяете» массив, аксессор свойств будет «сохранять», но вы не «выпускаете». Вы должны либо назначить напрямую на ivar, либо добавить 'autorelease'. Вероятно, стоит проверить другие сомнительные применения 'self.countHistoryArray = ...', которые могут вызвать проблемы. – walkytalky

+0

Я делаю '- (void) dealloc {[self.countHistoryArray release];}', который, я думаю, выполняет эту работу. Я ошибаюсь? – sprain

+0

В '-dealloc' вы должны либо вызывать' -release' на самом ivar: '[countHistoryArray release]', либо вы должны установить свойство в nil, которое освободит все, что было ранее сохранено в ivar, имея точно тот же эффект: 'self.countHistoryArray = nil'. Я предпочитаю вторую технику лично. –

ответ

10

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

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

Ваш вопрос название говорит: «Количество NSMutableArray вызывает 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

Ha! Очень хорошо, что работает! Спасибо! (Я когда-то менялся от отсчета до описания где-то). Что я не понимаю, так это: «NSLog (@«% @ », [self.countHistoryArray description]);' теперь тоже работает. Вы говорите, что это не сработает, но это так. Странные вещи ... – sprain

+0

'NSLog (@"% @ ", [self.countHistoryArray description]);' будет работать - моя формулировка, возможно, была слегка неоднозначной. В строковой строке стиля 'NSLog' вы должны использовать'% @ 'для любого объекта Obj-C и соответствующий символ формата для любых примитивов C ('% u' для unsigned ints, '% f' для float и т. Д.). Кроме того, вы можете просто использовать 'NSLog (@"% @ ", self.countHistoryArray)', так как 'NSLog' автоматически вызовет' description' для объекта. –

+0

Причина, по которой я думал, что это может быть так, потому что это распространенная ошибка, которую я делал много раз, когда учился Obj-C (и иногда все еще делаю, когда устал). –

0

Удалить autorelease от:

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

+0

Спасибо, но ... Я попробовал это раньше - и теперь снова. К сожалению, такая же ошибка. – sprain

+1

Нет, 'autorelease' в порядке, не путайте с этим. – walkytalky

+0

@walkytalky Спасибо, это то, о чем я тоже думал. Но я должен ошибаться, поэтому стоит попробовать :) – sprain

0

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

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

+0

Спасибо! Проблема решена. Я загляну в экземпляр/сохранить вещь. – sprain

0

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

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

Я попробовал и сделал простое изменение в собственности

Ранее моя собственность для NSMutableArray был

@property (nonatomic, assign) NSMutableArray * dataArray; 

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

@property (nonatomic, retain) NSMutableArray * dataArray; 

Изменено его от ASSIGN до СОХРАНИТЬ

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

Смежные вопросы