iphone响应程序链中操作方法所需的可见性是啥?

Posted

技术标签:

【中文标题】iphone响应程序链中操作方法所需的可见性是啥?【英文标题】:What is the required visibility of an action method in iphone responder chain?iphone响应程序链中操作方法所需的可见性是什么? 【发布时间】:2011-03-08 02:16:52 【问题描述】:

在 UIViewController 子类中,我创建了一个条形按钮项,它在响应者链中触发事件:

UIBarButtonItem* editListsButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleBordered target:nil action:@selector(edit)];
self.navigationItem.leftBarButtonItem = editListsButton;
[editListsButton release];

在祖先 UIViewController 子类的实现中(即在 .m 文件中)我有以下内容:

@interface GroupController (PrivateMethods)
    - (void) edit;
@end

- (void) edit 
    ... do something here ...

当然,在相应的 .h 文件中,我确实声明了编辑方法。这是我的一个随机错误。

无论如何,这应该可靠地工作吗?如何声明方法以便接收编辑事件有什么要求?

顺便说一句,我有报告称,每次触摸“编辑”栏按钮项都会导致应用程序崩溃,但仅来自成千上万的用户。我无法重现它。

【问题讨论】:

【参考方案1】:

Objective-C 方法除了在编译时粘贴声明之外没有“可见性”。在运行时,它们都是一样的。

首先,动作方法接受一个参数——发送者。因此,您的方法确实应该声明为:

- (IBAction)edit:(id)sender;

注意IBAction 实际上是#defined 为void。它仅由 Interface Builder 使用。由于您以编程方式执行操作,因此您可以使用void。当然,这引出了一个问题,即为什么你要以编程方式做事,因为这几乎总是浪费时间,但是......超出了这个问题的范围。

无论如何,是的,它应该可靠地工作。是否在标头中声明方法在运行时差异为零。

鉴于您的崩溃是间歇性的,听起来您可能有内存管理问题(或其他潜在的崩溃)。您是否构建并分析了您的代码?有崩溃日志吗?

【讨论】:

这是有用的信息,谢谢。回覆。崩溃,构建和分析显示没有问题,不幸的是没有可用的崩溃日志。顺便说一句,我认为该方法的 (id)sender 形式是 3 种正式有效形式中的一种,另一种是无 arg 形式。我想我在某处的苹果文档中看到了这一点。 (id) 发件人是传统形式,最广为人知,普遍推荐。无参数形式有点晚了。

以上是关于iphone响应程序链中操作方法所需的可见性是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 js 发送到 php、php 到 mysql 以及 REST json 响应时所需的正确编码/转义/htmlentities 是啥

方法链中的Linq中间对象在哪里和选择?

npm @types 包的类型 globalDevDependencies 的等价性是啥?

发送 iOS GameKit 消息所需的时间

计算机中执行程序所需的时钟周期数和执行时间的区别是啥

iPhone 5S (arm64) 所需的设备功能