iOS 中禁止使用某个方法的时候,我们常常会选择重写方法。
例如:
- (instancetype)init {
@throw [NSException exceptionWithName:@"不能使用init方法"
reason:@"请使用initWithRequestKey:params:或者initWithUrlString:params初始化方法"
userInfo:nil];
return nil;
}
这样重写方法,还是能调用~
在一些iOS文件中经常能看到NS_DESIGNATED_INITIALIZER
,NS_UNAVAILABLE
来修饰的方法,下面是MJRefreshConfig里面的一段代码
@interface MJRefreshConfig : NSObject
/** 默认使用的语言版本, 默认为 nil. 将随系统的语言自动改变 */
@property (copy, nonatomic, nullable) NSString *languageCode;
/** @return Singleton Config instance */
+ (instancetype)defaultConfig;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@end
通过这个案例可以发现使用NS_DESIGNATED_INITIALIZER
,NS_UNAVAILABLE
来修饰的方法是编译无法通过的~
效果如图:
使用
NS_UNAVAILABLE
修饰init
将会达到禁用init
方法的作用 作用如下图:总结:
使用NS_DESIGNATED_INITIALIZER
,NS_UNAVAILABLE
将可以禁止系统方法的使用,所以如果你想禁止使用某个方法可以尽量用NS_DESIGNATED_INITIALIZER
,NS_UNAVAILABLE
来修饰方法
- (instancetype)initWithDelegate:(id<JXPagerViewDelegate>)delegate NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;