UIBarButtonItem导致“无法识别的选择器发送到实例”

时间:2011-10-04 23:11:58

标签: ios objective-c cocoa-touch selector uibarbuttonitem

我将一个实例调用到我的main.m中的一个类到我的Controls.m类,但它似乎给了我一个“无法识别的选择器发送到实例”错误。知道我在这里做错了什么吗?每次我按下按钮它都会崩溃,但是在此代码中Controls.m设置为self?它应该没有找到测试选择器操作。

的main.m

- (void)loadView {
    Controls *ct = [[Controls alloc] init];
    [ct addControls];
    [ct release];
}

Controls.m

- (void)addControls {
    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, mv.frame.size.height-60, mv.frame.size.width, 40)];
    UIBarButtonItem *barBtnDataOverlay = [[UIBarButtonItem alloc] initWithTitle:@"Test Button" style:UIBarButtonSystemItemAction target:self action:@selector(test)];
    NSArray *toolbarButtons = [[NSArray alloc] initWithObjects:barBtnDataOverlay, nil];
    toolbar.items = toolbarButtons;
    [mv addSubview:toolbar];
    [barBtnDataOverlay release];
    [toolbar release];
 }

- (void)test {
    NSLog(@"TEST button hit");
}

1 个答案:

答案 0 :(得分:0)

ct将被[ct release]解除分配,因为不会留下任何保留。尝试在您的课程中添加ct视网膜属性以保持它。

在课堂定义中:

@property(nonatomic, retain) Controls *ct;

在您的实施中:

@synthesize ct;

...

将loadView更改为:

- (void)loadView {
    self.ct = [[Controls alloc] init];
    [self.ct addControls];
    [self.ct release];
}

甚至更整洁:

- (void)loadView {
    self.ct = [[[Controls alloc] init] autorelease];
    [self.ct addControls];
}

您还应该在ct

之类的地方发布viewDidUnload
- (void)viewDidUnLoad {
    self.ct = nil;
}
顺便说一下,这是UIViewController班吗?然后loadView方法应该分配view实例变量。如果您查看UIViewController的文档,您会看到:

  

如果为了手动创建视图而重写此方法,则应该这样做并将层次结构的根视图分配给view属性。