instancetype代替id进行实例化


使用instancetype关键字作为方法的返回值,能够返回一个类的实例。比如alloc,init等方法。
在一个合适的地方使用instancetype取代id将使你的代码更加安全。看下下面的代码:

@interface MyObject : NSObject
+ (instancetype)factoryMethodA;
+ (id)factoryMethodB;
@end

@implementation MyObject
+ (instancetype)factoryMethodA { return [[[self class] alloc] init]; }
+ (id)factoryMethodB { return [[[self class] alloc] init]; }
@end

void doSomething() {
    NSUInteger x, y;

    x = [[MyObject factoryMethodA] count]; // Return type of +factoryMethodA is taken to be "MyObject *"
    y = [[MyObject factoryMethodB] count]; // Return type of +factoryMethodB is "id"
}


方法+factoryMethodA的返回值是instancetype类型,即MyObject *类型。由于MyObject这个类没有-count这个方法,所以编译器会在x行给出这么一个警告:

main.m: ’MyObject’ may not respond to ‘count’


然而,由于方法+factoryMethodB的返回值是id类型,所以编译器在y行没有任何警告。


还有下面这个例子:

@interface MyObjectSubclass : MyObject
@end

void doSomethingElse() {
        NSString *aString = [MyObjectSubclass factoryMethodA];
}


编译器会报如下警告:

main.m: Incompatible pointer types initializing ’NSString *’ with an expression of type ’MyObjectSubclass *’

这两个例子就能大致说明instancetypeid的区别了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值