第04天OC语言(10):instancetype和id区别

  • 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?

instancetype 和 id的合理使用

学习前:你必须会什么?

id 是什么
id是一个动态数据类型.

动态数据类型的特点:
     在编译的时候 编译器并不知道 变量的真是类型, 只有在运行的时候 才知道它的真实类型
     并且 如果通过动态数据类型定义变量, 如果访问了不属于动态类型数据的属性和方法,编译器不会报错

一、本章笔记
  instancetype 和 id 都是万能指针 == 指向一个对象
  id 在编译的时候不能判断对象的真实类型
  instancetype 在编译的时候 可以判断对象的真实类型
 
  id 和 instancetype 除了一个在编译时不知道真实类型, 一个在编译时 知道真实类型以外, 还有一个区别
  id 可以用来 定义变量,可以作为返回值,可以作为形参
  instancetype 只能用于作为返回值
  注意 : 以后但凡自定义的构造方法, 返回值尽量使用 instancetype ,不要使用id

二、code
main.m
#pragma mark 10-instancetype和id区别
#pragma mark 概念
/*
  instancetype 和 id 都是万能指针 == 指向一个对象
  id 在编译的时候不能判断对象的真实类型
  instancetype 在编译的时候 可以判断对象的真实类型
 
  id 和 instancetype 除了一个在编译时不知道真实类型, 一个在编译时 知道真实类型以外, 还有一个区别
  id 可以用来 定义变量,可以作为返回值,可以作为形参
  instancetype 只能用于作为返回值
  注意 : 以后但凡自定义的构造方法, 返回值尽量使用 instancetype ,不要使用id
 */
#pragma mark - 代码
#import 
#pragma mark 类

#import "Person.h"

#pragma mark - main函数
int main(int argc, const char * argv[])
{
    
    Person *p = [[Person alloc]init];
    [p setAge:22];
    
    // 如果 init方法的返回值 是 instancetype, 那么将返回值赋值给一个 其它的对象 会一个警告
    
    // 如果是在以前,init的返回值 是id, 那么将init返回的对象地址 赋值给其他对象 是不会报错的
//    NSString *str = [[Person alloc]init];// incompatible pointer types initalizing 'NSStrin *' with an expression type 'Person *'
    
//    id str = [[Person alloc]init];
    instancetype p1 = [[[Person alloc]init];
    NSUInteger length = [str length];
    NSLog(@"length = %lu",length);
    
    return 0;
}

Person
>>>.h
#import 

@interface Person : NSObject

@property int age;


- (void)test:(id)ob;
//- (void)demo:(instancetype)obj; 

@end

>>>.m
#import "Person.h"

@implementation Person

// instancetype 和 id 都是万能指针 == 指向一个对象
// id 在编译的时候不能判断对象的真实类型
// instancetype 在编译的时候 可以判断对象的真实类型

// id 和 instancetype 除了一个在编译时不知道真实类型, 一个在编译时 知道真实类型以外, 还有一个区别
// id 可以用来 定义变量,可以作为返回值,可以作为形参
// instancetype 只能用于作为返回值
//注意 : 以后但凡自定义的构造方法, 返回值尽量使用 instancetype ,不要使用id
- (id)init
{
    if (self = [super init]) {
        _age = 33;
    }
    return self;
}

@end

你可能感兴趣的:(第04天OC语言(10):instancetype和id区别)