-1

我看到了 Flower an MyGarden 的示例,但是当我尝试制作类似的东西时它不起作用。我的代码:

类A.h:

#import <Foundation/Foundation.h>

@protocol CommDelegate <NSObject>
@required
-(void)funcB;
@end

@interface ClassA : NSObject
{
    id <CommDelegate> delegate;
}
@property (retain) id delegate;
-(void)funcB;
@end

类A.m

#import "ClassA.h"

@implementation ClassA
-(void) start
{
    [[self delegate] funcB];
}
@end

B类.h

#import <Foundation/Foundation.h>
#import "ClassA.h"

@interface ClassB : NSObject <CommDelegate>
@end

B类.m

#import "ClassB.h"

@implementation ClassB
-(void)funcB
{
    NSLog(@"HELLO!");
}
@end

主要是我在做:

ClassA* classa = [[ClassA alloc] init];
[classa start];

有人可以帮助我,并告诉我我做错了什么吗?

4

3 回答 3

2

代表团概述摘要:

  1. 创建一个@protocol,它是您希望可以从委托人调用但由您的委托人提供的方法。
  2. 在委托人的公共@interface 中添加委托@property。
  3. 在委托者的实现中使用委托属性,例如 result = [self.delegate methodInProtocol]
  4. 在委托的@implementation 中的某处设置委托属性: delegator.delegate = self;
  5. 在委托中实现协议方法(包括@interface上的<>)

委托只是一个指向将为您实现必要方法的对象的指针。在您的情况下,我认为您希望 classA 能够调用 funcB 方法,但该 funcB 由其他人实现。

要让另一个类实现这些方法的类中需要有一个委托属性,然后在要成为委托的类中,它应该将委托属性设置为 self。

正如其他人所指出的,您没有设置您的委托。在 B 类的某个地方,你需要一个

ClassA.delegate = self;
于 2012-10-10T19:37:27.510 回答
1
ClassA* classa = [[ClassA alloc] init];
[classa start];

看来您需要设置classa的委托。通常,您希望-start调用调用委托方法,但classa这里没有委托。做这个:

ClassB* classb = [[ClassB alloc] init];
ClassA* classa = [[ClassA alloc] init];
classa.delegate = classb;
[classa start];
于 2012-10-10T19:25:17.030 回答
1
  1. 你从不设置委托
  2. 您通常assign委托而不是retain他们来避免保留周期。(分配委托的对象通常会对对象有强引用,并负责nil在完成时将委托设置为)

#import <Foundation/Foundation.h>
@protocol CommDelegate <NSObject>
@required
-(void)funcB;
@end

@interface ClassA : NSObject
{
    id <CommDelegate> delegate;
}
@property (assign) id delegate; //assign
-(void)funcB;
@end

这是重要的部分:

ClassA* classa = [[ClassA alloc] init]; //Consider creating an init method that accepts the delegate
classa.delegate = self; //Assuming self conforms to CommDelegate
[classa start];
于 2012-10-10T19:25:55.253 回答