在类方法中使用委托

时间:2013-05-29 11:31:07

标签: iphone ios objective-c

我想在类方法中调用委托。

下面的示例显然不起作用,因为委托是在类方法中访问的实例变量。 (错误:在类方法中访问实例变量'委托')

是否有警报?

我的标题文件:

//  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

3 个答案:

答案 0 :(得分:3)

三个明显的选择:

  • 的Singleton
  • 指向委托的静态变量(即类变量)
  • 使用NSNotification而不是代理

由于单例(和静态变量)无法跟踪代理的生命周期,我认为选项三将是最干净的。

答案 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];
    }