【问题标题】:What's the difference between these Objective C method styles?这些 Objective C 方法风格之间有什么区别?
【发布时间】:2011-01-25 12:26:47
【问题描述】:

Objective C 中似乎有两种编写方法的标准方式,我不太明白有什么区别以及为什么使用一种而不是另一种。例如,来自 UIWebViewDelegate:

- (void)webViewDidFinishLoad:(UIWebView *)webView {

}

- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {

}

为什么第二个不简单写成webViewDidFailLoadWithError,或者为什么第一个不匹配第二个样式?

另一个例子,这次来自 UITableViewDataSource:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 0;
}

为什么 numberOfSectionsInTableView 的格式与其他方法不同?

如果这是一个非常简单的问题,我很抱歉 - 它一直困扰着我一段时间,我想把它弄清楚!

提前感谢您的帮助。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    这一切都归结为参数的数量。几乎每个委托方法都将方法的发送者作为其第一个参数传递。如果方法不需要更多参数,则方法签名采用第一种样式,否则采用第二种样式,遵循 Cocoa 约定命名每个参数。

    不幸的是,不能在最后一个参数之后将更多文本附加到方法签名中。如果是这样,我相信 Apple 更愿意将方法命名为 - (void) webView:(UIWebView *)webView didFinishLoad

    编辑: 最近在 Stack Overflow 上就这一语法决策的历史进行了一次有趣的讨论:Why must the last part of an Objective-C method name take an argument (when there is more than one part)?,甚至 Objective-C 的创建者 Brad Cox 也加入其中。

    【讨论】:

      【解决方案2】:

      您可以同时在屏幕上显示多个 Web 视图或表格视图。在您列出的方法的回调期间,您可以查看 Web 视图或表格视图的 tag 属性,以确定哪个 Web 视图或表格视图负责此类回调。

      【讨论】:

        【解决方案3】:

        这是 Apple 自己的关于委托方法的 Objective-C 编码指南的一部分: http://akos.ma/gt

        委托方法(或委托方法)是当某些事件发生时对象在其委托中调用的方法(如果委托实现了它们)。它们具有独特的形式,同样适用于对象数据源中调用的方法:

        • 以识别发送消息的对象的类开始名称:
        - (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
        - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
        

        因此,为了回答您的问题,您引用的所有方法都遵循相同的模式:方法的第一个(有时也是唯一的)参数是调用委托方法的对象。

        【讨论】:

          【解决方案4】:

          为什么第二个不简单写成 webViewDidFailLoadWithError...

          因为它必须是:

          - (void) webViewDidFailLoadWithError:(NSError *)error {
          
          }
          

          缺少第一个参数,所以当在delegate上调用方法时,你不会知道哪个webview返回了错误。

          ...或者为什么第一个不匹配 第二种风格?

          因为它必须是

          - (void)webView:(UIWebView *)webView DidFinishLoad {
          }
          

          这不是一个有效的方法名称,因为 'DidFinishLoad' 部分前面没有参数 - 也就是说,您不能只将部分添加到方法名称而不将它们与参数匹配(唯一的例外完全不接收参数的方法)。

          我希望这说明清楚。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-04
            相关资源
            最近更新 更多