ios 你必須瞭解的系統定義宏使用

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

  • nonnull做用:不能爲空

使用方法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

  • typedef定義的類型的nullability特性一般依賴於上下文,即便是在Audited Regions中,也不能假定它爲nonnull。
  • 複雜的指針類型(如id *)必須顯示去指定是nonnull仍是nullable。例如,指定一個指向nullable對象的nonnull指針,可使用」__nullable id * __nonnull」。
  • 咱們常常使用的NSError **一般是被假定爲一個指向nullable NSError對象的nullable指針。

 

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;
}
相關文章
相關標籤/搜索