我看到了Flower a MyGarden的例子,但是当我尝试制作类似的东西时它不起作用。我的代码:
ClassA.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
ClassA.m
#import "ClassA.h"
@implementation ClassA
-(void) start
{
[[self delegate] funcB];
}
@end
ClassB.h
#import <Foundation/Foundation.h>
#import "ClassA.h"
@interface ClassB : NSObject <CommDelegate>
@end
ClassB.m
#import "ClassB.h"
@implementation ClassB
-(void)funcB
{
NSLog(@"HELLO!");
}
@end
主要是我在做:
ClassA* classa = [[ClassA alloc] init];
[classa start];
有人可以帮助我,告诉我我做错了吗?
答案 0 :(得分:2)
代表团概述摘要:
委托只是指向将为您实现必要方法的对象的指针。在您的情况下,我认为您希望classA能够调用funcB方法,但是要由其他人实现该funcB。
类中需要有一个委托属性,希望让另一个类实现这些方法,然后在作为委托的类中,它应该将委托属性设置为self。
正如其他人所说,你没有设置你的代表。在classB的某个地方你需要一个
ClassA.delegate = self;
答案 1 :(得分: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];
答案 2 :(得分:1)
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];