自定义代理问题

时间:2013-01-31 05:11:33

标签: ios objective-c delegates automatic-ref-counting weak

我正在使用自定义委托和协议功能。

我实现了我的课程如下:

@protocol MyDelegate <NSObject>

@required
- (void)update;

@end

@interface MyHandlerClass : NSObject
{
    id <MyDelegate>delegate;
}
@property (nonatomic, weak) id <MyDelegate>delegate;

@end

我的实现类看起来像:

@implementation MyHandlerClass
@synthesize delegate = _delegate;
- (void)updateRequired: (id)sender
{
    if(delegate)
    {
        [delegate update];
    }
}
@end

从另一个班级,我将其设置为:

[sharedManager setDelegate:self];

但是当updateRequired被触发时,它显示为nil

然后我添加了一个setter方法,如:

- (void)setDelegate:(id<MyDelegate>)aDelegate
{
   delegate = aDelegate;
}

一切正常!!!

然后我更改了updateRequired方法(没有自定义设置器),如:

- (void)updateRequired: (id)sender
    {
        if(_delegate)
        {
            [_delegate update];
        }
    }

它也工作正常!!!

我无法找到为什么第一种情况不起作用以及为什么它适用于其他两种情况?

请帮我找到问题,提前致谢

3 个答案:

答案 0 :(得分:3)

使用时

if(delegate)

您指向实例变量“delegate”。

但是,当你使用

[sharedManager setDelegate:self]

这是将实例变量“_delegate”设置为“self”。

试试这个:

if (self.delegate) {
    [self.delegate update];
}

答案 1 :(得分:2)

要在updateRequired方法中访问您的委托属性,您可以使用私有变量 _delegate 或使用 self.delegate 来执行此操作。因为使用delegate = _delegate进行合成时,会自动创建setter和getter。

这一行告诉编译器为委托创建一个setter和getter,并且他们应该使用名为_delegate的ivar。如果没有= _delegate部分,编译器将假定属性和ivar具有相同的名称。

答案 2 :(得分:2)

你无意中宣布了一个名为delegate

的ivar
  id <MyDelegate>delegate;

和另一个名为_delegate

的ivar
  @synthesize delegate = _delegate;

一些建议......

  • 不要将iVar与@property声明分开声明

  • 不要@synthesize,因为你不需要XCode 4.4。编译器将自动合成并自动创建具有前导下划线的iVar

  • 总是通过它的内部和外部的财产来引用你的ivar。只有例外在init,dealloc和内部自定义setter和getter中。

这就是你的代码看起来的样子

    @protocol MyDelegate <NSObject>

    @required
    - (void)update;
    @end

    @interface MyHandlerClass : NSObject
    @property (nonatomic, weak) id <MyDelegate>delegate;
    @end

    @implementation MyHandlerClass

    - (void)updateRequired: (id)sender
    {
        if(self.delegate)
        {
            [self.delegate update];
        }
    }
    @end