是否私下声明了委托方法?

时间:2012-03-05 20:09:14

标签: objective-c cocoa-touch delegates

在我的视图控制器的viewDidLoad方法中,我创建了一个NSURLConnection

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest 
                                                               delegate:self]

您可以看到我将委托设置为self

然后我实现了委托方法

-(void) connection: (NSURLConnection*) connection didReceiveResponse: (NSURLResponse*) reponse {
   //myImplementation;
}

此实现仅在@implementation ViewController @end块中定义,并且未在ViewController' @interface中声明。

所以我猜这个方法是私有的吗?它编译并运行良好。但我无法在[self connection: connection didReceiveResponse: response]自己的方法中将此方法称为ViewController

解释是什么?

2 个答案:

答案 0 :(得分:2)

通过在类的接口定义中包含NSURLConnectionDelegate protocol来声明方法:

@interface MyViewController : UIViewController <NSURLConnectionDelegate>

这告诉编译器您的类承诺实现该协议的所有必需方法,并且它可以实现可选方法(实际上,这个特定协议只有 可选方法)。因此声明公开存在,它们只是在另一个文件中。

答案 1 :(得分:2)

该方法是“私有的”,因为可以在Objective-C中使用私有方法。实际上,您可以从类外部调用该方法,即使它未在接口中声明。这可以通过Objective-C处理方法调用的方式来实现 - 任何对象都可以接收任何消息(方法的obj-c术语),但是对象是否可以实际使用该方法做某事取决于任何事情的数量。查看Apple的文档中的Object Messaging

简短的回答是,您的代码可以正常工作,因为您的类中存在方法的实现,而Objective-C知道如何在运行时找到它,无论您的类接口如何。