协议可选方法在未实现时发生崩溃

时间:2017-11-20 07:04:47

标签: ios objective-c protocols

我正在使用带有一些可选方法的协议

#import <UIKit/UIKit.h>
@class TextViewTableViewCell;

@protocol TextViewTableViewCellDelegate

@optional
- (void)textViewDidChange:(UITextView *)textView forIndexPath:(NSIndexPath *)indexPath;
- (void)textViewTableViewCellDoneTyping:(UITextView *)textView forIndexPath:(NSIndexPath *)indexPath;
- (BOOL)shouldChangeEditTextCellText:(TextViewTableViewCell *)cell newText:(NSString *)newText;

@end

@interface TextViewTableViewCell : UITableViewCell <UITextViewDelegate>

但是,如果我使用了我实现此协议的类中的任何功能,它就会崩溃

我不知道为什么会这样。根据我的选择方法并非强制使用。

当调用委托函数并调用协议方法

时,它会对此方法造成崩溃
- (void)textViewDidChange:(UITextView *)textView
{
[self.delegate textViewDidChange:self.textView forIndexPath:self.indexPath];
}

2 个答案:

答案 0 :(得分:4)

@optional注释要求编译器避免生成构建警告,如果符合协议的类尚未添加实现。但是,这并不意味着您可以执行可选方法而不会发生崩溃。

使用respondsToSelector:确认对象是否可以响应选择器。

if ([self.delegate respondsToSelector:@selector(textViewDidChange:forIndexPath:)])
但是,在Swift中,事情变得更简单了。您可以使用 ”?”在方法调用之前:

delegate?.textViewDidChange?(textView: self.textView, forIndexPath: self.indexPath)

答案 1 :(得分:-1)

  • 如果您没有在其他类上实现委托方法但是调用它,则会发生这种情况。要处理崩溃,请使用以下代码
- (void)textViewDidChange:(UITextView *)textView
{
    if ([self.delegate respondsToSelector:@selector(textViewDidChange:)]) {
            [self.delegate textViewDidChange:self.textView forIndexPath:self.indexPath];
    }
}