【问题标题】:iOS, unrecognized selector sent to instance?iOS,无法识别的选择器发送到实例?
【发布时间】:2014-02-18 08:06:17
【问题描述】:

我有一个带有导入自定义操作栏的主屏幕。我在一个单独的 .xib 文件中创建了这个 actionBar,带有一个 .m 和 .h 文件。

我在 actionBar.m 的 viewDidLoad 中进行了一些图形设置,例如 backgroundColor 和其他一些东西。

我在这个actionBar 上也有一个按钮,我用我通常链接按钮的方式链接了一个IBAction

我像这样将我的 actionBar 加载到我的主屏幕中:

ActionBarWithLogoff *actionBar = [[ActionBarWithLogoff alloc] initWithNibName:@"ActionBarWithLogoff" bundle:nil];
[topBar addSubview:actionBar.view];
[actionBar release];

我的 actionBar.h:

- (IBAction)ActionBarLogoff:(id)sender;

我的actionBars.m的方法:

-(void) ActionBarLogoff:(UIButton *)sender
{
NSLog(@"!!!!!!!!!!ActionBarLogoff");
}

这是我的错误,当我点击按钮时,我得到以下错误:

2014-01-27 13:52:21.856 GB_Mobil_DK[2954:60b] -[__NSArrayM ActionBarLogoff:]: 无法识别的选择器发送到实例 0x1656d880 2014-01-27 13:52:21.858 GB_Mobil_DK[2954:60b] * 终止应用程序到期 未捕获的异常“NSInvalidArgumentException”,原因: '-[__NSArrayM ActionBarLogoff:]: 无法识别的选择器发送到 实例 0x1656d880' * 第一次抛出调用栈:(0x2f94be83 0x39ca86c7 0x2f94f7b7 0x2f94e0af 0x2f89cdc8 0x32104da3 0x32104d3f 0x32104d13 0x320f0743 0x3210475b 0x32104425 0x320ff451 0x320d4d79 0x320d3569 0x2f916f1f 0x2f9163e7 0x2f914bd7 0x2f87f471 0x2f87f253 0x345b92eb 0x32134845 0x97985 0x3a1a1ab7) libc++abi.dylib: 以未捕获的方式终止 NSException 类型的异常

谁能告诉我为什么?最重要的是能帮我解决这个问题^^?

【问题讨论】:

  • 显示真正的错误信息。
  • 检查按钮的出口方法名称和真实方法名称。可能两者都不同。
  • 你在使用 ARC....
  • 转到断点导航器,在面板底部单击“加号” - 添加异常断点... - 添加。然后重复所有步骤,注意我们在您的代码中出现了错误。
  • 我正在使用 MRC,请查看帖子以获取更新的完整错误消息

标签: ios iphone xib ibaction


【解决方案1】:

您正在释放actionBar 实例并仅保留其view。如果actionBar 实例是按钮操作的响应者,则按钮单击消息将发送到已删除的实例。您应该保留 actionBar 实例。一种方法是使其成为 ivar 或 retain 属性。

看起来您正在为自定义视图创建UIViewController。相反,您可以使用其 XIB 创建一个自定义 UIView

编辑

声明保留属性,

@property (nonatomic, retain) ActionBarWithLogoff *actionBar;

只需声明为 ivar,

@interface YourViewController: UIViewController {
    ActionBarWithLogoff *actionBar;
}

而在dealloc 方法中,

-(void) dealloc {
    //...

    [actionBar release];

    //...
}

希望有帮助!

【讨论】:

  • 所以我应该停止调用 [actionBar release] 吗?还是我需要将其更改为保留它的东西?
  • @user2408952 是的,你不应该像现在这样释放它。查看我的更新答案以获取建议。
  • 我通过将发布更改为保留来使其工作。如果这不是正确的做法,请回复。如果是,那么非常感谢您的帮助。
  • @user2408952 不,这不是正确的方法。它会造成内存泄漏。您应该在您的类中将actionBar 声明为retain-property 或作为实例变量。在类的dealloc 方法中释放它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多