2014-01-26 2 views
0

У меня возникла проблема при загрузке/создании нового вида xib-файла вида. Я получаю код EXEC_BAD_ACCESS = 2, а в стеке вызовов я вижу множественный вызов метода initWithCoder. Я не понимаю, почему это произошло, поскольку я вызываю alloc init для моего класса только один раз. Ниже мой код:получить EXEC_BAD_ACCESS внутри initWithCoder

@interface SongListView : NSView 
@property (nonatomic, strong) IBOutlet NSScrollView* view; 
@end 

@implementation SongListView 

- (id)initWithFrame:(NSRect)frameRect 
{ 
    self = [super initWithFrame:frameRect]; 

    if(self) 
    { 
     [self setup]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder: aDecoder]; 

    if(self) 
    { 
     [self setup]; 
    } 

    return self; 
} 

- (void)setup 
{ 
    NSArray *nib; 

    [[NSBundle mainBundle] loadNibNamed:@"scrollTabViewItemWithTableView" 
            owner:self 
         topLevelObjects:&nib]; 
    [self addSubview: self.view]; 
} 

@end 

и это, как я создаю SongListView:

SongListView* tableView = [[SongListView alloc] init]; 

Может кто-нибудь объяснить мне, что происходит, почему я получаю Mutiple вызов метода initWithCoder, и как это исправить?

ответ

0

Вы пытаетесь добавить свой вид как подвид само по себе:

[self addSubview:self.view]; 

код, как это больно глазам. У вас есть объект SongListView, но вы его назвали tableView. Вы определили инициализатор для initWithFrame:, но вы отправляете ему сообщение init, когда вы его создаете.

+0

Сам по себе '-init' в порядке, так как он эквивалентен' initWithFrame: 'с' CGRectZero'. Однако, что будет дальше, это беспорядок. – coverback

0

Загрузочный наконечник вызывает вызов -initWithCoder: в соответствующем классе и передает self, поскольку владелец присваивает представление верхнего уровня в nib как self. У вас есть рекурсия, потому что при каждой загрузке вы снова пытаетесь загрузить представление.

Как только вы загрузили наконечник, в -initWithCoder: ваш вид уже загружен, и вам не нужно загружать nib или добавлять subview.

Что обычно происходит в setup - это некоторые дополнения к пользовательскому интерфейсу или некоторые другие вещи, которые невозможно сделать в IB.

+0

Наличие «я» как владельца в целом прекрасное. Вот как вы подключаете IBOutlets от и IBActions к «Владелец файла». –

+0

@WilShipley не является в этом случае упомянутым владельцем файла? Без этого аргумента nib loader не знал бы, к какому экземпляру присоединяться. – coverback

+0

Да, это правильно, но я не думаю, что «initWithCoder:» вызывается из-за этой ссылки на себя. Думаю, второй пункт указывает на проблему самостоятельно. –

1

Как правило, подклассы NSView не должны загружать XIB. Они должны либо быть В XIB (и таким образом созданы, когда XIB загружается), либо создаются в коде.

В вашем случае есть ряд архитектурно странных вещей, но я подозреваю, что авария вызвана вы имея SongListView экземпляр внутри scrollTabViewItemWithTableView.xib, поэтому при загрузке XIB запуске программы установки и загрузить настройки XIB и запустить и загрузите XIB и запустите установку и ...

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