0

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

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

有alertnative吗?

我的头文件:

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

3 回答 3

3

三个明显的选择:

  • 辛格尔顿
  • 指向委托的静态变量(即类变量)
  • 使用 NSNotification 而不是委托

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

于 2013-05-29T11:50:26.080 回答
0

我想知道上下文,它可以让你在那种情况下运行。;-) 反正:

第一:为特定的实例对象设置委托。因此,对于同一(委托)类的不同实例,您可以有不同的委托。

第二:类方法在该类的类对象内运行。这是一个不同于该类的每个实例对象的对象。所以没有什么可以称为“代表”。您可以拥有 100 名代表。

第三:您的类对象本身需要一个委托。所以你必须向delegate类对象添加一个属性,然后使用它。(是的,可以有一个类对象的属性。我没有声明的属性。)如果您需要有关如何执行此操作的更多信息,只需评论它。我将添加代码。

于 2013-05-29T11:51:02.600 回答
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];
    }
于 2013-05-29T11:52:03.840 回答