Почему этот код вылетает с EXC_BAD_ACCESS во время NSArray InitWithObjects - PullRequest
0 голосов
/ 08 марта 2011

Обратите внимание на приведенный ниже код, два оператора NSLOG. «Aaa» распечатывается, а «bbb» - нет. Вместо этого симулятор падает с EXC_BAD_ACCESS. Я знаю, что это обычно означает, что объект, к которому я пытаюсь получить доступ, был преждевременно освобожден. Я просто не могу понять, что не так ...

Обновлен:

вот мой .х

#import <UIKit/UIKit.h>


@interface vcAddCat : UIViewController  <UIPickerViewDataSource, UIPickerViewDelegate> {

NSManagedObjectContext *managedObjectContext;

IBOutlet UIPickerView * pickerView;
NSArray * _weights;
NSArray * _categories;
IBOutlet UILabel *lastCat;
IBOutlet UILabel *lastWeight;

}

У меня нет ни строк @property, ни @synthesize ни для одного массива ...

Вот два отрывка из моего .m

- (void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);

    _categories=[[NSArray alloc] initWithObjects: @"Homework",@"Quizzes",@"Tests", @"Mid-Term Exam", nil];
;

    NSLog(@"aaa");

    _weights=[[NSArray alloc] initWithObjects: @"1",@"2",@"3",@"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"11", @"12", @"13", @"14", @"15", @"16", @"17", @"18", @"19", @"20", @"21",@"22",@"23", @"24", @"25", nil];


    NSLog(@"bbb");

.. и вот где я освобождаю массивы ...

- (void)dealloc {
[super dealloc];
[_categories release];
[_weights release];
NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__);

}

Ответы [ 5 ]

6 голосов
/ 08 марта 2011

ОК - предупреждение о неудачнике.

Извините, ребята.Все работало, когда я тестировал вначале только 10 объектов для вставки.Как только я это начал, я добавил остальные объекты (11 - 100), и именно тогда он рухнул.Когда я разместил код выше, я обрезал список объектов до 25 элементов - казалось, слишком избыточным.

Ну, объекты 26, 36, 46 и т. Д. Содержат опечатку, где перед строковым значением я пропустил предшествующий '@'.

Исправлено, и я вернулся в нужное русло.

Спасибо за вашу помощь и извините за хромую ошибку.

Фил

0 голосов
/ 08 марта 2011

Попробуйте зайти в настройки аргументов для вашего исполняемого файла и включить NSZombieEnabled в YES.Это остановит вашу программу на той же строке, что приведет к плохому доступу к памяти.

0 голосов
/ 08 марта 2011

Я просто поместил этот точный код в приложение, которое у меня есть, и оно работает нормально. Я достиг "BBB". Итак, у меня вопрос: как вы определили _weights? В моем классе я использовал:

@interface MyClass : NSObject {
   NSArray* _weights;
}
0 голосов
/ 08 марта 2011

Пожалуйста, измените свою сделку на

- (void)dealloc {
[_categories release];
[_weights release];
[super dealloc];
}

Никогда не вызывайте [super dealloc]; до освобождения других объектов класса.

0 голосов
/ 08 марта 2011

Посмотрите, что проблема где-то в вашем массиве _weights. Отладьте код и проверьте, когда вы достигнете второго NSLog, какое значение массива, правильно ли оно сохранено. Вы сделали массив как свойство и синтезировали его

В вашем .h файле

NSArray *_weights;

@property( nonatomic, retain ) NSArray  *_weights;

В вашем .m файле

@synthesize _weights
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...