【问题标题】:Declaring delegates on .m在 .m 上声明代表
【发布时间】:2012-11-08 14:42:34
【问题描述】:

我对 Objective-C 比较陌生。

我在网上找到了一个代码,它在 rootViewController.m 上有类似的东西(这是一个基于 navigationController 的应用程序)。

@interface RootViewController (CManagerDelegate) <CManagerDelegate>
@end

@interface RootViewController (PViewDelegate) <PViewDelegate>
@end

两个问题:

  1. 这些行在 rootViewController.m 的开头做了什么
  2. 这些行在代码中做了什么?请在这种特殊情况下解释括号中和 之间的内容。

谢谢。

【问题讨论】:

    标签: iphone ios ipad cocoa-touch cocoa


    【解决方案1】:

    一句话:您发布的代码使RootViewController类私下符合一些委托协议。

    委托协议用于让一个类声明它理解来自另一个类对象的消息这一事实。例如,视图控制器可以声明它理解手势识别器的委托消息。

    该类在内部使用手势识别器这一事实通常是与该类的其他客户端无关的实现细节。最好不要在公共接口中发布这个事实,而是将其放入实现(.m 文件)中。

    类别(和类扩展)让您可以做到这一点:使类符合协议而不更改主要的@interface

    一个漂亮而优雅的解决方案!

    【讨论】:

    • 好的,但我不明白的是这个。如果声明没有括号部分,我会理解为类分配了委托协议,但括号部分听起来像是对类的扩展。问题是如果所讨论的声明在同一个类本身的实现中,如何扩展一个类。这听起来很疯狂,我的大脑并没有吸收该声明中包含的所有营养。另一个问题是:为什么要让一个类私下遵守协议?是秘密还是什么? :D
    • 啊,另一件事是,声明和@end 之间绝对没有任何内容......只是我提出问题的那几行。
    • @DesperateDeveloper:这不在@implementation 内;它通常在它之前。 .h/.m 只是约定(实际上,编译器根本不关心 .h 文件,这就是为什么你必须告诉它用#import 来查看它们的原因)。在编译器看到原始的@interface 之后,可以随时扩展类的@interface
    • @DesperateDeveloper:关于类别的隐私:问题不在于它是否应该是私有的;问题是它是否应该公开。通常没有理由公开类符合协议的事实;因此,它应该是私有的。是的,在@interface Foo@end 之间不需要任何东西。您不需要添加自己的任何内容,在这种情况下,协议的内容就是您要声明的所有内容。
    • 谢谢,但你们还没有解释括号部分在做什么...... :)
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多