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ます。

次に、次のようなセッターメソッドを追加しました。

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

すべて正常に動作します!!!

次に、updateRequiredメソッドを(カスタムセッターなしで)次のように変更しました。

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

こちらも元気に動いています!!!

最初のケースで機能しない理由と、他の 2 つのケースで機能する理由がわかりませんでした。

問題を見つけるのを手伝ってください、事前に感謝します

4

3 に答える 3

3

使用するとき

if(delegate)

インスタンス変数「delegate」を指しています。

ただし、使用するときは

[sharedManager setDelegate:self]

これは、インスタンス変数「_delegate」を「self」に設定しています。

これを試して:

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

1 つの ivar を誤って宣言しました。delegate

  id <MyDelegate>delegate;

と呼ばれる別のivar_delegate

  @synthesize delegate = _delegate;

いくつかの提案...

  • @property 宣言とは別に iVar を宣言しないでください

  • @synthesize はしないでください。XCode 4.4 以降では必要ありません。コンパイラは、先頭にアンダースコアが付いた iVar を自動合成および自動作成します。

  • クラスの内外で、常にそのプロパティを介して ivar を参照してください。唯一の例外は、init、dealloc、およびカスタム セッターとゲッターの内部にあります。

だから、これはあなたのコードがどのように見えるべきかです

    @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 に答える
2

updateRequired メソッドでデリゲート プロパティにアクセスするには、プライベート変数_delegateを使用するか、 self.delegateを使用します。delegate = _delegate を使用して合成すると、セッターとゲッターが自動的に作成されるためです。

この行は、デリゲート用のセッターとゲッターを作成し、_delegate と呼ばれる ivar を使用する必要があることをコンパイラに指示します。= _delegate 部分がない場合、コンパイラはプロパティと ivar が同じ名前であると想定します。

于 2013-01-31T05:18:58.880 に答える