我想在类方法中调用委托。
下面的示例显然不起作用,因为委托是在类方法中访问的实例变量。 (错误:在类方法中访问实例变量'委托')
是否有警报?
我的标题文件:
// MyClass.h
#import <Foundation/Foundation.h>
@protocol MyDelegate <NSObject>
-(void)update;
@end
@interface MyClass : NSObject
{
id<MyDelegate> delegate;
}
@property (nonatomic, retain) id delegate;
+(void)methodThatInvokesDelegate;
@end
我的实施档案:
// MyClass.m
#import "MyClass.h"
@implementation MyClass
@synthesize delegate;
+(void)methodThatInvokesDelegate{
[delegate update];
}
@end
答案 0 :(得分:3)
三个明显的选择:
由于单例(和静态变量)无法跟踪代理的生命周期,我认为选项三将是最干净的。
答案 1 :(得分:0)
我想知道上下文,让你在那种情况下运行。 ;-)无论如何:
首先:为特定的实例对象设置委托。因此,您可以为同一(委派)类的不同实例使用不同的委托。
第二:类方法在该类的类对象内运行。这是一个与该类的每个实例对象不同的对象。所以没有什么可以被称为“代表”。你可以拥有100名代表。
第三:您的类对象需要一个委托。因此,您必须向类对象添加属性delegate
,然后使用它。 (是的,可以将属性作为类对象。我做了不写入声明的属性。)如果您需要有关如何执行此操作的更多信息,请对其进行注释。我将添加代码。
答案 2 :(得分:0)
我不确定这是否会对你有所帮助,但我有类似的情况,我有一个用于数据加载的类方法。在这种情况下,类会自我实例化(以便调用者不需要),直到完成为止。 (这段代码在某种程度上进行了编辑以使其在这里工作)
头文件:
@protocol DataLoaderDelegate2 <NSObject>
- (void) dataLoaderSuccess:(NSData *)data loader:(id)theloader;
- (void) dataLoaderFailed:(NSString *)error loader:(id)theloader;
@end
@interface DataLoader2 : NSObject {
NSURLConnection *conn;
NSMutableData *receivedData;
NSFileHandle *fileHandle;
id <DataLoaderDelegate2> delegate;
}
@property (nonatomic, assign) id<DataLoaderDelegate2>delegate;
调用启动进程 - 对initWithRequest的调用传递“self”。
+ (DataLoader2 *)loadWithURLRequest:(NSURLRequest *)req delegate:(id)_delegate
{
DataLoader2 *dl = [[DataLoader2 alloc] init];
[dl setDelegate:_delegate];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
return dl;
}
当数据加载完成后,它会清除
之类的内容 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if ([delegate respondsToSelector:@selector(dataLoaderSuccess:loader:)])
[delegate dataLoaderSuccess:(fileHandle)?(id)fileHandle:(id)receivedData loader:self];
[self autorelease];
}