不管是iOS原生方法還是平時自己寫方法,都能碰到instancetype
和id
,那麼這兩者有何區別呢?
一、instancetype
和 id
的異同
相同點:instancetype
是clang 3.5
開始提供的一個關鍵字,跟id
類似,用於表示某個方法返回的未知類型的Objective-C
對象。
不同點:
instancetype
只能作爲返回值類型,id
不僅可以作爲返回值類型也可以當作參數使用。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、init
與new
的異同
alloc
:分配內存方法;init
:初始化方法;new
:該關鍵字代替上面兩個函數,分配內存,並且初始化。
異同點:使用new
關鍵字初始化時,初始化方法會默認執行init
方法,不能調用其他的initMethod
自定義的初始化方法;如果想重寫複雜的初始化建議不要使用new
關鍵字;方法如果只是想簡單的初始化一個對象,使用new
和alloc、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];
控制檯打印結果:
參考官方文檔