0

オプションのメソッドをいくつか含むプロトコルを使用します。

@protocol PhotoDropDownDelegate <NSObject>

@optional
    - (void)getEditResult:(NSString *)status;
    - (void)getImageForDiagram:(UIImage *)image andImagePath:(NSString *)imagePath;
    - (void)dismissPhotoDropDown;

@end

これをクラスに割り当てます

photoDropDownViewController.photoDropDownDelegate = self;

私は1つの方法だけを使用します

- (void)getImageForDiagram:(UIImage *)image andImagePath:(NSString *)imagePath
{
    // Make a Image on center of screen
    PhotoLayer *photoLayer = [PhotoLayer nodeWithLengthOfShape:300 andHeight:200 andPathToImage:imagePath];
    photoLayer.position = ccp(400, 500);
    photoLayer.nameObject = [self makeNewName_ForShape];    
    photoLayer.isSelected_BottomRightElip = YES;
    photoLayer.isSelected = YES;


    [photoLayer doWhenSelected_Elip_BottomRight];
    [photoLayer show_Elip];

    [list_Shapes addObject:photoLayer];

    [self addChild:photoLayer];
    photoLayer = nil;

    // Set Button Delete
    selected_GerneralShapeLayer = (GerneralShapeLayer *) [list_Shapes lastObject];
    [self updateStatusForButtonDelete];
}

次に、コンパイラはエラーを表示します:

[AddDiagramLayer dismissPhotoDropDown]: unrecognized selector sent to instance 0xb2a8320'

他のメソッドを実装すると、エラーが消えます

-(void)getEditResult:(NSString *)status {

}

-(void)dismissPhotoDropDown {

}

私が知っているように、@option のメソッドが使用できるかどうかはわかりません。ここで何が起こったのか理解できません。誰か説明してくれませんか

4

1 に答える 1

12

@optionalオプションのメソッドが実装されていない場合、ディレクティブはコンパイラの警告を抑制するだけです。ただし、クラスが実装していないメソッドを呼び出すと、呼び出しようとしたセレクター (メソッド) が実装されていないため、クラスによって認識されないため、アプリは引き続きクラッシュします。

デリゲートがメソッドを呼び出す前に実装しているかどうかを確認することで、これを回避できます。

// Check that the object that is set as the delegate implements the method you are about to call
if ([self.photoDropDownDelegate respondsToSelector:@selector(dismissPhotoDropDown)]) {
    // The object does implement the method, so you can safely call it.
    [self.photoDropDownDelegate dismissPhotoDropDown];
}

このように、デリゲート オブジェクトがオプションのメソッドを実装している場合、それが呼び出されます。それ以外の場合はそうではなく、プログラムは通常どおり実行され続けます。

@optionalメソッドを実装しない場合のコンパイラの警告を回避するために、実装がオプションのメソッドを示すためにディレクティブを引き続き使用する必要があることに注意してください。これは、クライアントに配布されるオープン ソース ソフトウェアまたはライブラリにとって特に重要です。このディレクティブは、実装を読んでおらず、ヘッダーしか見ることができない開発者に、これらのメソッドを実装する必要がないことを伝えるためです。すべてがうまくいくでしょう。

于 2013-07-17T10:41:49.890 に答える