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 是啥