1

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

我实现了我的类,如下所示:

@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];
        }
    }

它也工作正常!

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

请帮助我找到问题,在此先感谢

4

3 回答 3

3

当你使用

if(delegate)

您指向实例变量“委托”。

但是,当您使用

[sharedManager setDelegate:self]

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

试试这个:

if (self.delegate) {
    [self.delegate update];
}
于 2013-01-31T05:19:34.497 回答
2

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

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

于 2013-01-31T05:18:58.880 回答
2

您无意中声明了一个名为delegate

  id <MyDelegate>delegate;

和另一个名为_delegate

  @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
于 2013-01-31T05:28:22.167 回答