簡(jiǎn)介
IOS開發(fā)中經(jīng)常會(huì)碰到不確定類型的情況沦寂,在這種情況下OC提供了兩種方式供開發(fā)者選擇:
instancetype在類型表示上嗜侮,跟id一樣,可以表示任何對(duì)象類型
instancetype只能用在返回值類型上,不能像id一樣用在參數(shù)類型上
instancetype比id多一個(gè)好處:編譯器會(huì)檢測(cè)instancetype的真實(shí)類型
其中第3點(diǎn), 會(huì)發(fā)生在如下情況下:
+ (id)person{
return [[self alloc] init];
}
NSString *str = [Person person];
上面這行代碼,用字符串類型的指針指向Person類的對(duì)象,編譯通過(guò),因?yàn)閜erson返回的id類型,任何指針都可以指向它
而如果用instancetype,編譯時(shí),會(huì)有警告.也就是說(shuō)instancetype比id多了檢測(cè)真實(shí)類型的功能,可以提前暴露程序存在的風(fēng)險(xiǎn)
+ (instancetype)person{
return [[self alloc] init];
}
NSString *str = [Person person]; //會(huì)有警告,[Person person]返回的Person類型, 警告信息:把Person類型的數(shù)據(jù)賦值給字符串類型
可以這么說(shuō),作為返回值時(shí),凡是用id的地方,都建議換成instancetype,例如下面的代碼
- (instancetype)initWithDic:(NSDictionary *) app
{
if(self == [super init]){
self.name = app[@"name"];
self.icon = app[@"icon"];
}
return self;
}
+ (instancetype)initWithDic:(NSDictionary *) app
{
return [[[self alloc]init] initWithDic:app];
}