Почему reptsToselector не работает для меня в этом случае?

У меня есть небольшая загадка, которая сводит меня прямо вверх по стене. Я использую делегацию довольно сильно, как шаблон в приложении, который я пишу. Я пытаюсь быть как «осторожным» в коде, вызывающем делегатом, так как смогу, чтобы проверить делегат с помощью «[делегата RESPSTSELECTOR] на каждом делегированном вызове. Все работает нормально, если я не нахожусь в подклассе UIView. В этом случае RepentStoselector возвращает НЕТ, но я могу безопасно позвонить в код делегата так ясно, что он существует и работает правильно.

Я варил его до самого простого примера, который я могу ниже. Любая помощь, которую вы можете предоставить, будет оценена:

Внутри моего файла подкласса UIVIEW Subclass .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

Внутри моего файла класса делегатов:

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

@interface ViewDelegate : NSObject <TestDelegate> {

}

@end

Внутри моего файла класса делегата:

#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);
5
задан Perception 31 August 2011 в 12:55
поделиться