为什么在这种情况下respondsToSelector对我不起作用?

时间:2011-08-31 12:46:57

标签: objective-c ios

我有一个小难题,正在把我推到墙上。我正在使用委托作为我正在编写的应用程序中的模式。我试图通过在每个委托调用中使用“[delegate respondsToSelector]”测试代理来尽可能地在调用委托的代码中“谨慎”。除非我在UIView子类中,否则一切正常。在这种情况下,respondsToSelector返回NO但我可以安全地调用委托代码,因此它存在且工作正常。

我把它归结为下面最简单的例子。您可以提供的任何帮助将不胜感激:

在我的UIView子类的.h文件中:

#import <UIKit/UIKit.h>

@protocol TestDelegate <NSObject>
@optional
-(double)GetLineWidth;
@end

@interface ViewSubclass : UIView {
    id<TestDelegate> delegate;
}

@property (nonatomic, retain) id<TestDelegate> delegate;

@end

在我的委托类的.h文件中:

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

@interface ViewDelegate : NSObject <TestDelegate> {

}

@end

在我的委托类的.m文件中:

#import "ViewDelegate.h"

@implementation ViewDelegate

-(double)GetLineWidth {
    return 25.0;
}

@end

在我的UIView子类的.m文件中:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    double lineWidth = 2.0;

    if (delegate == nil) {
        ViewDelegate *vd = [[ViewDelegate alloc]init];
        delegate = vd;
    }

    // If I comment out the "if" statement and just call the delegate
    // delegate directly, the call works!
    if ([delegate respondsToSelector:@selector(GetLineWidth:)]) {
        lineWidth = [delegate GetLineWidth];
    }

    CGContextSetLineWidth(context, lineWidth);

2 个答案:

答案 0 :(得分:14)

-(double)GetLineWidth的选择器为@selector(GetLineWidth)

你的选择器中有一个额外的冒号。

if ([delegate respondsToSelector:@selector(GetLineWidth:)]) {
                                                       ^

答案 1 :(得分:3)

if-statement 替换为:

if ([delegate respondsToSelector:@selector(GetLineWidth)]) {
    lineWidth = [delegate GetLineWidth];
}