1. id和instancetype类型,

  id和instancetype类型区别:
    1. id和instancetype都可以用来作为方法的返回值

    2. id可以用来定义类型,instancetype不能用来定义类型
      id obj;
      instancetype obj2; // 错误

    3. instancetype可以精确返回值类型

2.动态类型检测,

  1. isKindOfClass判断某个对象是否是类的实例对象,或者子类的实例对象(对象和类)
    格式:[对象 isKindOfClass 类对象];
    BOOL isInstance = [ani isKindOfClass:[Animal class]];

  2. isMemberOfClass 判断对象是否是指定类的实例对象(对象和类)
    格式: [对象 isMemberOfClass: 类对象]
    BOOL isInstance = [dog isMemberOfClass:[Animal class]];

  3、判断类是否是指定类的子类(类和类之间的关系)
    格式: [类A isSubclassOfClass:类B];
    BOOL isSub = [Dog isSubclassOfClass:[Animal class]];

3.响应方法,构造方法,

  1. 响应方法:

    Bool isInstace = [p respondsToselector:@selector(run)];
    // 没有参数
    -(id) performSelector:selector(应用selector指定的方法) NSObject的方法
    // 一个参数
    -(id) performSelector:selector withObject:object(应用selector指定的方法,传递参数 object)
    // 二个参数
    -(id) performSelector:selector withObject:object1 withObject:object2(应用selector指 定的方法,传递参数object1和object2)

  2. 构造方法

    创建对象:Person *p=[Person new];
    new方法内部做了3件事情:
    可以把new方法拆开如下:
      (1)使用alloc方法来分配存储空间(返回分配的对象);
      (2)使用init方法来对象进行初始化。
      (3)返回对象的内存首地址。

    (1).调用类方法+alloc分配存储空间,返回未经初始化的对象
      Person *p1=[Person alloc];
    (2).调用对象方法-init进行初始化,返回对象本身
      Person *p2=[p1 init];
    (3).以上两个过程整合为一句:
      Person *p=[[Person alloc] init];

      (1)init方法就是构造方法,是用来初始化对象的方法,称为构造初始化。

      (2) alloc // [a b] a给b发消息
      向某个类发送alloc消息的结果 ,为该类分配内存(对象的内存地址已经有了),以存放该类的全部实例变量 。

  注意
    一个刚刚分配的对象并不能立即使用 ,
    需要先初始化该对象,然后才能使用它 ,
    但由于未进行初始化, 随后可能出现一些不可预测的行为.

4.重写构造方法,

  1. [super init]的作用:先调用父类的初始化方法,对从父类继承过来的成员变量进行初始化。初始化完了之后,返回我当前的对象指针。

  2. 重写构造方法注意事项:
    (1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候 应该首先对从父类继承而来的成员变量先进行初始化。
    (2)原则:先初始化父类的,再初始化子类的。
    (3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
    (4)注意点:先调用父类的构造方法[super init]; 再进行子类内部成员变量的初始化。

    -(instancetype)init
    {
      if(self = [super init]){
        // 给成员变量初始化
      }
      return self;
    }

5.自定义构造方法

  1. 自定义构造方法的规范
    (1)一定是对象方法,以减号开头
    (2)返回值一般是id类型或者instancetype类型
    (3)方法名一般以initWith开头

  2. 自定义构造方法的实现
    - (instancetype)initWithName:(NSString *)name andAge:(int)age;
    {
      self = [super init];
      if (self) {
        // 要初始化的成员变量.
        _name = name;
        _age = age;
      }
      return self;
    }

  3. 自定义构造方法的使用注意
    (1). 自己做自己的事情
    (2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性

  4. 使用场景
    如果对象被创建的时候, 需要对里面某些属性进行初始化(设置), 这个时候就可以使用构造方法

六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法的更多相关文章

  1. 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?

    转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...

  2. c++ :OOP之静态类型与动态类型

    所谓静态类型即类型指针或引用的字面类型:而动态类型即类型指针或引用的实际类型. 这一对概念一般发生在基类和派生类之间. 如: class Base { ..... } class Derived : ...

  3. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  4. C# 中的动态类型

    翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...

  5. OC基础--构造方法 id类型

    new方法实现原理: new做了三件事情 1.开辟存储空间  + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...

  6. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  7. OC基础-day06

    #pragma mark - Day06_01_点语法 1. 点语法. 1). 如果要访问对象的属性,还要去调用属性对应的setter getter方法.好烦躁好烦躁. 2). 点语法的作用: 快速调 ...

  8. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  9. OC基础(11)

    构造方法 自定义构造方法 继承中的自定义构造方法 自定义类工厂方法 *:first-child { margin-top: 0 !important; } body > *:last-child ...

随机推荐

  1. POJ 3177 边双连通求连通量度的问题

    这道题的总体思路就是找到连通量让它能够看作一个集合,然后找这个集合的度,度数为1的连通量为k,那么需要添加(k+1)/2条边才可以保证边双连通 这里因为一个连通量中low[]大小是相同的,所以我们用a ...

  2. HDU1423 最长公共上升子序列LCIS

    Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the lengt ...

  3. 【BZOJ3295】动态逆序对(BIT套动态加点线段树)

    题意:对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. 给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对 ...

  4. msp430项目编程17

    msp430中项目---红外遥控系统 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  5. Python中排序的灵活使用

    Python中列表按指定标准排序实例 概述 本题需要先输入机器的数目和任务的数目. 在接下来的n行中每行分别包含机器的最大执行时间和机器所能执行任务的最大强度. 在接下来的n行中每行分别包含任务执行时 ...

  6. BZOJ 2308 莫队入门经典

    题目链接  https://www.lydsy.com/JudgeOnline/problem.php?id=2038 参考博客 https://www.cnblogs.com/Paul-Guderi ...

  7. Spring中基于AOP的XML架构

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-wi ...

  8. 碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770

  9. tomcat的安装和使用

    1.下载最新的tomcat:https://tomcat.apache.org/download-90.cgi 最新版本9.0.2属于beta版本,就没有必要尝鲜踩坑了 使用8.5.24的稳定版本的二 ...

  10. 【APUE】wait与waitpid函数

    当一个进程终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对 ...