[英]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.