簡體   English   中英

在initWithCoder中獲取EXEC_BAD_ACCESS

[英]get EXEC_BAD_ACCESS inside initWithCoder

在加載/創建新的視圖表單xib文件時遇到問題。 我得到EXEC_BAD_ACCESS code = 2並且在我的調用堆棧上,我看到initWithCoder方法的多次調用。 我不明白為什么會這樣,因為我只為我的類調用alloc init。 在我的代碼下面:

@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];

有人可以解釋我發生了什么,為什么我多次調用initWithCoder方法,以及如何解決它?

通常,您的NSView子類不應加載XIB。 它們應該在XIB中(並在XIB加載時創建)或在代碼中創建。

在您的情況下,有許多體系結構上的奇怪問題,但是我懷疑崩潰是由您在scrollTabViewItemWithTableView.xib中具有SongListView實例引起的,因此,當您加載XIB時,請運行安裝程序並加載XIB並運行安裝程序並加載XIB然后運行安裝程序並...

您正在嘗試將視圖添加為自身的子視圖:

[self addSubview:self.view];

這樣的代碼會傷害我的眼睛。 您有一個SongListView對象,但已將其命名為tableView 您已經為initWithFrame:定義了一個初始化程序initWithFrame:但是您在創建它時將其發送給init消息。

加載nib會導致在相關類上調用-initWithCoder:並將self傳遞為所有者將nib中的頂級視圖分配為self。 您有一個遞歸,因為每次加載都會嘗試再次加載視圖。

加載筆尖后,在-initWithCoder:您的視圖已加載,無需加載筆尖或添加子視圖。

setup中通常會添加一些UI,或者在IB中無法完成的其他一些事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM