免费开源的iOS开发学习平台

OC数据类型:3-id与instancetype

id类型

id数据类型可存储任何类型的对象。从某种意义上说,它是通用对象类型,这和C语言中的void *很相似。如果要用基本类型代替,需要对基本数据类型进行封装。 id是一个指向任意一个继承了NSObject类的对象。需要注意的是, id是一个指针,所以在使用id的时候不需要加星号。例如:

id anObject = nil;

id类型是Objective-C中经常使用的一种重要数据类型,它是Objective-C动态绑定的基础。
下方的代码中,在一个数组中存储了若干个对象,有NSNumber型的,有NSString型的,当我们无法准确获取对象的类型时,我们可以使用id这种通用的对象类型。

int main(int argc, const char * argv[]) {
    @autoreleasepool {   
        NSArray *array = @[@123,@"99ios"];
        id obj = array[1];
        NSLog(@"%@",obj);
    }
    return 0;
}

instancetype类型

在类方法中,例如,以alloc, new开头的方法,以及实例方法中 autorelease,init,retain等方法的返回值类型就是instancetype类型,这些就称为关联返回类型的方法。这些方法的返回值是一个以方法所在的类为类型的对象。例如,在NSObject类的alloc和init方法,调用后会返回一个NSObject类型的对象。

+ (instancetype)alloc;
- (instancetype)init;

使用instancetype作为方法返回值的好处是可以确定对象类型,以便帮助编译器更好地定位代码问题。

id和instancetype的异同

id和instancetype的相同点在于都可以作为方法的返回值类型。而两者的不同点体现在:

  • id 可以作为方法或函数的参数的类型,也可以单独用这种类型定义变量,但是instancetype不行。

  • 如果方法的返回值类型是instancetype,那么它返回的一定是这个类的类型的对象;如果方法的返回值类型是id,那么它返回的未知类型的对象。

示例代码

https://github.com/99ios/2.1.3