- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
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 <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>
@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
网友评论