1. UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))objective-c
- (instancetype)init UNAVAILABLE_ATTRIBUTE;安全
告诉编译器该方法不可用,若是强行调用编译器会提示错误。好比某个类在构造的时候不想直接经过init来初始化,只能经过特定的初始化方法()好比单例,就能够将init方法标记为unavailable;atom
效果以下:spa
调用了会有警告.net
2. NS_ASSUME_NONNULL_BEGIN , NS_ASSUME_NONNULL_END指针
若是须要每一个属性或每一个方法都去指定nonnull和nullable,是一件很是繁琐的事。苹果为了减轻咱们的工做量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。在这两个宏之间的代码,全部简单指针对象都被假定为nonnull,所以咱们只须要去指定那些nullable的指针code
使用方法xml
NS_ASSUME_NONNULL_BEGIN @interface TestNullabilityClass () @property (nonatomic, copy) NSArray * items; - (id)itemWithName:(nullable NSString *)name; @end NS_ASSUME_NONNULL_END
在上面的代码中,items属性默认是nonnull的,itemWithName:方法的返回值也是nonnull,而参数是指定为nullable的。对象
不过,为了安全起见,苹果还制定了几条规则:blog
3. NS_DESIGNATED_INITIALIZER
Objective-C 中主要经过NS_DESIGNATED_INITIALIZER
宏来实现指定构造器的。这里之因此要用这个宏,每每是想告诉调用者要用这个方法去初始化(构造)类对象。
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) - (instancetype)init; - (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
/* init是 convenience initializer方法只是简单的调用initWithName:(指定初始化器),并设置一个默认值。initWithName:进行完整的初始化并调用父类的init方法。 指定初始化器有如下几个规则: 1.指定初始化器方法必须调用父类的指定初始化器方法,若是父类为NSObject时调用 [super init]。 2.convenience initializer方法必须调用其余的初始化方法,知道最后指向指定初始化 器方法。 3.一个类若是有指定初始化器方法,那么就必须实现全部父类的指定初始化器方法。 */ - (instancetype)init { return [self initWithName:@"Unknown"]; } - (instancetype)initWithName:(NSString *)name { self = [super init]; if (self) { _name = [name copy]; } return self; }