-1

Flower an 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];

誰かが私を助けて、私が間違っていることを教えてもらえますか?

4

3 に答える 3

2

委任の概要:

  1. デリゲーターから呼び出し可能にしたいが、デリゲートによって提供されるメソッドである @protocol を作成します。
  2. 委任者の public @interface に委任 @property を追加します。
  3. デリゲートの実装内でデリゲート プロパティを使用します。例: result = [self.delegate methodInProtocol]
  4. デリゲートの @implementation のどこかにデリゲート プロパティを設定します。 delegator.delegate = self;
  5. デリゲートにプロトコル メソッドを実装します (@interface に <> を含めます)。

デリゲートは、必要なメソッドを実装するオブジェクトへの単なるポインターです。あなたの場合、classA が funcB メソッドを呼び出せるようにしたいと思いますが、その funcB は他の誰かによって実装される必要があります。

別のクラスにこれらのメソッドを実装させたいクラスにはデリゲート プロパティが必要であり、デリゲートになるクラスでは、デリゲート プロパティを self に設定する必要があります。

他の人が指摘したように、デリゲートを設定しません。classB のどこかで

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 に答える