【发布时间】:2010-12-09 04:00:23
【问题描述】:
我一直在围绕 Apple 的授权和协议文档寻找答案,但一天多之后,我决定放弃,让你们试一试。我有三个类:HTTPManager、LoginManager 和 FetchManager。您可能会猜到这些类的作用,但要明确...
- HTTPManager - 包装 NSURLConnection 并为 LoginManager 和 FetchManager 提供一个简单的接口来执行带有身份验证的 HTTP 请求。
- LoginManager / FetchManager - 基本上是同一个类,但它们对 HTTPManager 消息的响应不同。
HTTPManager 需要一个委托来实现 HTTPManagerDelegate 协议,而 LoginManager 和 FetchManager 都这样做。 Login- 和 FetchManager 类还为我的应用程序委托提供了一个协议,以便数据可以一路返回用户界面。
在我的应用程序委托的init: 方法中,我初始化了一个登录和一个提取管理器,并收到以下警告:
warning: class 'MyAppDelegate' does not implement the 'HTTPManagerDelegate' protocol
warning: incompatible Objective-C types assigning 'struct HTTPManager *', expected 'struct LoginManager *'
被初始化的两个类都不是从 HTTPManager 派生的,但它们确实实现了 HTTPManagerDelegate 协议。产生上述警告的代码行是:
_loginMgr = [[LoginManager alloc] initWithDelegate:self];
那么到底是什么让 LoginManager 的initWithDelegate: 方法返回了HTTPManager*?没有继承,而且我的返回类型是正确的,所以对我来说这是一些我无法做到最好的黑暗形式的巫术。
这是我的应用程序的外壳。可能存在拼写错误和小不一致,所以在假设句法问题之前问我:
// HTTPManager.h
@protocol HTTPManagerDelegate
...
@end
@interface HTTPManager : NSObject
{
id <HTTPManagerDelegate> _delegate;
...
}
- (HTTPManager *) initWithDelegate:(id <HTTPManagerDelegate>)delegate;
...
@end
// LoginManager.h
@protocol LoginManagerDelegate
...
@end
@interface LoginManager : NSObject <HTTPManagerDelegate>
{
id <LoginManagerDelegate> _delegate;
...
}
- (LoginManager *) initWithDelegate:(id <LoginManagerDelegate>)delegate;
...
@end
// MyAppDelegate.h
@interface MyAppDelegate : NSObject <NSApplicationDelegate, LoginManagerDelegate, FetchManagerDelegate>
{
LoginManager *_loginMgr;
...
}
...
@end
// MyAppDelegate.m
...
- (MyAppDelegate *) init
{
self = [super init];
if (self)
{
// WARNING HAPPENS HERE
_loginMgr = [[LoginManager alloc] initWithDelegate:self];
...
}
return self;
}
...
提前致谢。
【问题讨论】:
标签: objective-c cocoa xcode delegation