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