Summary: It is unsafe to call protocol methods defined optional. Before calling them we should check it the implementation exists by calling `if ([object respondsToSelector:selector(...)]) ...` Without the above check we get run time crashes. Reviewed By: jvillard Differential Revision: D15554951 fbshipit-source-id: f0560971bmaster
parent
88d31a7a21
commit
24728dc093
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2019-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@protocol BarDelegate<NSObject>
|
||||
@optional
|
||||
- (void)optionalFunction;
|
||||
@end
|
||||
|
||||
@interface Bar : NSObject
|
||||
@property(weak, nonatomic) id<BarDelegate> delegate;
|
||||
- (void)action;
|
||||
@end
|
||||
|
||||
@implementation Bar
|
||||
- (void)unsafeAction {
|
||||
[self.delegate optionalFunction];
|
||||
}
|
||||
|
||||
- (void)safeAction {
|
||||
id<BarDelegate> delegate = self.delegate;
|
||||
if ([delegate respondsToSelector:@selector(optionalFunction)]) {
|
||||
[self.delegate optionalFunction];
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
@interface Foo : NSObject<BarDelegate>
|
||||
- (void)doSomething;
|
||||
@end
|
||||
|
||||
@implementation Foo
|
||||
- (void)doSomething {
|
||||
Bar* x = [Bar new];
|
||||
x.delegate = self;
|
||||
[x unsafeAction];
|
||||
}
|
||||
@end
|
||||
|
||||
int main(int argc, const char* argv[]) {
|
||||
Foo* y = [Foo new];
|
||||
[y doSomething];
|
||||
return 0;
|
||||
}
|
Loading…
Reference in new issue