框架设计
1.NS_DESIGNATED_INITIALIZER
- 方法后面带有 NS_DESIGNATED_INITIALIZER 时, 为特定构造方法
- 注意:子类如果重写了父类的特定构造方法, 那么必须使用super调用父类的特定构造方法
- 警告信息:
- Designated initializer missing a 'super' call to a designated initializer of the super class
- 例子
- (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.titleLabel.font = [UIFont systemFontOfSize:16]; // 文字颜色 [self setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; [self setTitleColor:[UIColor redColor] forState:UIControlStateSelected]; } return self; }
2.NS_REQUIRES_SUPER
- 方法后面带有 NS_REQUIRES_SUPER , 则必须先调用父类的方法
- 警告信息:
- Method possibly missing a [super run] call
@interface XMGTest : NSObject - (void)run NS_REQUIRES_SUPER; @end @interface XMGSecondTest : XMGTest @end @implementation XMGSecondTest - (void)run { // 不调用, 则会有警告信信 //[super run]; } @end
3.NSParameterAssert
- 断言评估一个条件,如果条件为 false ,调用当前线程的断点句柄。每一个线程有它自已的断点句柄,它是一个 NSAsserttionHandler 类的对象。当被调用时,断言句柄打印一个错误信息,该条信息中包含了方法名、类名或函数名。然后,它就抛出一个 NSInternalInconsistencyException 异常。
- Assertions evaluate a condition and, if the condition evaluates to false, call the assertion handler for the current thread, passing it a format string and a variable number of arguments. Each thread has its own assertion handler, which is an object of classNSAssertionHandler. When invoked, an assertion handler prints an error message that includes method and class names (or the function name). It then raises anNSInternalInconsistencyException exception.
- 这个宏用于确认一个 Objective-C 的方法的有效性。简单提供参数作为条件就行。该宏评估这个参数,如果为 false ,它就打印一个错误日志信息,该信息包含了参数并且抛出一个异常。
- This macro validates a parameter for an Objective-C method. Simply provide the parameter as the condition argument. The macro evaluates the parameter and, if it is false, it logs an error message that includes the parameter and then raises an exception.
- 如果定义了预处理宏 NS_BLOCK_ASSERTIONS 断言就被禁止了。所有的断点宏都返回 void。
- Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return void.
例子:
- (void)each_:(void (^)(id obj))block{ // 如果 blick 不满足条件: block != nil, 程序就会抛错 NSParameterAssert(block != nil); [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // 执行 block block(obj); }]; }
4.NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END
http://www.cnblogs.com/KeenLeung/p/5316862.html