_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 && [_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 没有调用方法
html _ $。on_bind_delegate_live.html
delegate = self 导致线程 1:exc_bad_instruction (code=exc_i386_invop subcode=0x0)