iOS-instancetype與id的區別以及alloc、init與new的區別

不管是iOS原生方法還是平時自己寫方法,都能碰到instancetypeid,那麼這兩者有何區別呢?

一、instancetypeid的異同

相同點:instancetypeclang 3.5開始提供的一個關鍵字,跟id類似,用於表示某個方法返回的未知類型的Objective-C對象。

不同點:

  1. instancetype只能作爲返回值類型,id不僅可以作爲返回值類型也可以當作參數使用。
  2. instancetype作爲返回值類型返回值時,編譯器會檢測其真實類型,id則沒有該功能。

舉個例子:創建一個Student類,如下

@interface Student : NSObject
+ (instancetype)student;
//+ (id)student;
@end
+ (instancetype)student
{
    return [[[self class] alloc] init];
}

// 創建一個Student類的對象,用NSString來接收student對象

    NSString *student = [Student student];
    NSLog(@"%@",student);

當使用instancetype時,會有一個警告意思是類型不匹配;如果使用id作爲返回值則不會有該警告。
在這裏插入圖片描述
二、alloc、initnew的異同

alloc:分配內存方法;init:初始化方法;new:該關鍵字代替上面兩個函數,分配內存,並且初始化。

異同點:使用new關鍵字初始化時,初始化方法會默認執行init方法,不能調用其他的initMethod自定義的初始化方法;如果想重寫複雜的初始化建議不要使用new關鍵字;方法如果只是想簡單的初始化一個對象,使用newalloc、init完全一樣的。

驗證下:我們重寫init方法

- (instancetype)init
{
    self = [super init];
    if (!self) return nil;

    NSLog(@"我是通過 new 或者 init 過來的");

    return self;
}

創建兩個Student類的對象:

    Student *student = [[Student alloc] init];
    Student *student2 = [Student new];

控制檯打印結果:
在這裏插入圖片描述
參考官方文檔

關於alloc更多內容查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章