_delegate respondsToSelector:selector 没有调用方法

Posted

技术标签:

【中文标题】_delegate respondsToSelector:selector 没有调用方法【英文标题】:_delegate respondsToSelector:selector is not calling the method 【发布时间】:2013-09-18 22:09:32 【问题描述】:

我有一个类和一个视图控制器。类有 _delegate respondsToSelector:selector。但它没有调用方法(选择器)。查看下面的代码后,请您告诉我我做错了什么。仅供参考,此代码之前有效,但突然停止工作。

MyClass.h:

@protocol MyClassDelegate <NSObject>

@optional
-(void) receivedEvent:(TripEvent *) event;
@end

@interface MyClass : NSObject<MyClassEngine>

@property(assign) id<MyClassDelegate> delegate;
@property BOOL delegateOnMainThread;

-(id) initWithDelegate:(id<UbiTripRecorderDelegate>) tripDelegate
      onMainThread:(BOOL) onMainThread;

- (void) dispatchDelegate:(SEL)selector
           withObject:(id)obj;

MyClass.m 包含以下代码:

#import "MyClass.h"

@implementation MyClass
....
....
-(void) startPlaying 
    [self dispatchDelegate:@selector(receivedEvent:) withObject:newEvent];



- (void) dispatchDelegate:(SEL)selector   withObject:(id)obj 
   @try 
      if(_delegate && [_delegate respondsToSelector:selector]) 
       NSLog(@"I can't come to this point");
       
    

我还在视图控制器 (MyViewController.h) 中添加了以下代码:

@interface MyViewController : BaseViewController<MyClassDelegate>

最后实现了MyViewcontroller.m中的方法:

-(void) receivedEvent : (TripEvent *) event 
    NSLog(@"I'm called");

问题在于 if(_delegate && [_delegate respondsToSelector:selector]) - 逻辑永远不会返回 true。任何人都可以检查代码并让我知道,如果我的代码有任何问题吗?

【问题讨论】:

-(void) receivedEvent:(TripEvent *) event 是否在 MyClass.m 上实现? 是的,是在MyViewController.m上实现的;但没有在头文件 MyViewController.h 中声明;我可以出问题吗? 是的,_delegate 为零。 【参考方案1】:

确保您的 _delegate 不是 nil,否则 if 语句永远不会为真。

你也可以简化

if(_delegate &amp;&amp; [_delegate respondsToSelector:selector])

if([_delegate respondsToSelector:selector])

因为发送到nil 的消息总是返回 0 或 NO。在这种情况下,如果 _delegate 是 nil[_delegate respondsToSelector:selector] 将返回 NO

此外,您没有在标头中声明方法不会导致任何运行时差异。如果找不到此类方法,可能会出现编译器警告/错误。

【讨论】:

你能告诉我为什么在这种情况下 delegate 是 nil 吗?我该如何解决? 你需要给它分配一些东西 更新:delegate 仍然是 nil - 但是选择器/方法被正确调用。似乎问题未知。因为,有时它会起作用,有时它不起作用。

以上是关于_delegate respondsToSelector:selector 没有调用方法的主要内容,如果未能解决你的问题,请参考以下文章

_delegate respondsToSelector:selector 没有调用方法

Delegate 改变指向

html _ $。on_bind_delegate_live.html

网关开发6.lua绑定委托(delegate)实现多播调用

koa源码之delegate使用

delegate = self 导致线程 1:exc_bad_instruction (code=exc_i386_invop subcode=0x0)