07-09、instancetype和id關鍵字的區別

instancetype 和 id 都是萬能指針 都可以 指向一個對象

instancetype 和 id類型的區別:

1、id在編譯的時候不能判斷對象的真實類型
instancetype在編譯的時候可以判斷對象的真實類型
2、id和instancetype除了一個在編譯時不知道真實類型, 一個在編譯時知道真實類型以外, 還有一個區別
id可以用來定義變量, 可以作為返回值, 可以作為形參
instancetype只能用于作為返回值

注意: 以后但凡自定義構造方法, 返回值盡量使用instancetype, 不要使用id

main.m
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {

//    Person *p  =[[Person alloc] init];
//    [p setAge:99];
// 如果init方法的返回值是instancetype, 那么將返回值賦值給一個其它的對象會報一個警告
// 如果是在以前, init的返回值是id, 那么將init返回的對象地址賦值給其它對象是不會報警告的
//    NSString *str = [[Person alloc] init];
id p = [[Person alloc] init];
//    instancetype p1 = [[Person alloc] init];
//    NSUInteger length = [str length];
//    NSLog(@"length = %lu", length);

return 0;
}
Person.m
#import "Person.h"

@implementation Person
// 注意: 以后但凡自定義構造方法, 返回值盡量使用instancetype, 不要使用id
- (instancetype)init
//- (id)init
{
if (self = [super init]) {
    _age = 5;
}
return self;
}
@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容