Obj-C:我想了解代表,但我错过了一些东西

时间:2012-10-10 19:20:23

标签: objective-c xcode delegates

我看到了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];

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

3 个答案:

答案 0 :(得分:2)

代表团概述摘要:

  1. 创建一个@protocol,它是您希望从委托者调用但由您的代理提供的方法。
  2. 在委托人的public @interface中添加委托@property。
  3. 在委托人的实施中使用委托属性,例如result = [self.delegate methodInProtocol]
  4. 在委托的@implementation中的某处设置委托属性:   delegator.delegate = self;
  5. 在委托中实施协议方法(在@interface上包含&lt;&gt;)
  6. 委托只是指向将为您实现必要方法的对象的指针。在您的情况下,我认为您希望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)

  1. 您永远不会设置代理
  2. 您通常assign委托而不是retain代理,以避免保留周期。 (分配委托的对象通常具有对目标的强引用,并且负责在完成后将委托设置为nil

  3. #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];