id和instancetype区别

id、instancetype

id

一个类的实例的指针,万能指针

申明

typedef struct objc_object *id;

instancetype

使用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]; // 返回对象是MyObject类型
    y = [[MyObject factoryMethodB] count]; // 返回对象是id类型
}

instancetype的返回类型就是(MyObject *),因为MyObject没有 -count这个方法,所以编译器给出了一个警告:

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

然后另一个id类型的却没有任何警告,上面已经说明id可以指向任意类型,所以在没有执行这段代码之前系统不知道该对象是否拥有-count这个方法.

再看另一个例子:

@interface MyObjectSubclass : MyObject
@end

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

这个时候编译器给出了警告:

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

直接指明我们的类型不匹配,所以我们应该使用instancetype

比如下面例子

@interface MyObject
- (id)myFactoryMethod;
@end

应该写成这样

@interface MyObject
- (instancetype)myFactoryMethod;
@end

总结

  • id 可以作为方法参数传递 intancetype 不能
  • id 可以去接受对象 instancetype不能
  • 在自定义初始化或者便利构造方法中尽量使用instancetype作为返回值类型,保证类型安全
转载:http://archerzz.ninja/ios/id-instancetype.html
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用正则表达式或 JSON 解析来判断这两个字符串的类型。 方法1: 使用正则表达式判断是否为 JSON 字符串 你可以使用正则表达式来检查字符串是否符合 JSON 格式。以下是一个示例代码: ```javascript const isJSONString = (str) => { try { JSON.parse(str); return true; } catch (e) { return false; } }; const jsonString = "{\"InstanceTypeId\":\"ecs.hfc6.6xlarge\",\"InstanceExtendInfo\":null,\"CpuArchitecture\":\"X86\",\"Core\":24,\"Gpus\":{},\"Memory\":48}"; const vpcString = "vpc-0jlvf9wp37bh5qfelr707"; console.log(isJSONString(jsonString)); // true console.log(isJSONString(vpcString)); // false ``` 在上述代码中,我们定义了一个 isJSONString 函数,该函数尝试解析字符串为 JSON 格式。如果解析成功,则返回 true;如果解析失败,则返回 false。我们分别将 jsonString 和 vpcString 传入 isJSONString 函数进行判断,结果会分别输出 true 和 false。 方法2: 使用 JSON 解析尝试转换 你可以使用 JSON.parse 方法尝试将字符串转换为对象。如果转换成功,则说明该字符串是一个 JSON 字符串,否则则不是。以下是一个示例代码: ```javascript const jsonString = "{\"InstanceTypeId\":\"ecs.hfc6.6xlarge\",\"InstanceExtendInfo\":null,\"CpuArchitecture\":\"X86\",\"Core\":24,\"Gpus\":{},\"Memory\":48}"; const vpcString = "vpc-0jlvf9wp37bh5qfelr707"; let isJSON = true; try { JSON.parse(jsonString); } catch (e) { isJSON = false; } console.log(isJSON); // true try { JSON.parse(vpcString); } catch (e) { isJSON = false; } console.log(isJSON); // false ``` 在上述代码中,我们使用 try-catch 块来尝试将字符串转换为 JSON 对象。如果转换成功,则说明该字符串是一个 JSON 字符串,isJSON 变量为 true;如果转换失败,则说明该字符串不是一个 JSON 字符串,isJSON 变量为 false。我们分别对 jsonString 和 vpcString 进行转换判断,最后输出结果。 希望这两种方法能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值