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; }