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. jsp页面遍历输出

    <c:foreach>类似于for和foreach循环 以下是我目前见过的用法: 1.循环遍历,输出所有的元素.<c:foreach items="${list}" ...

  2. Leetcode 321.拼接最大数

    拼接最大数 给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个 ...

  3. NOIP2014D2T2寻找道路(Spfa)

    洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. ——代码 #include <cstdio> ...

  4. CodeForces - 750D New Year and Fireworks

    因为 烟花的最大范围是各个方向150格 所以 最大的空间应该是 300*300 BFS和DFS均可 模拟每一个烟花爆炸的过程 但是要注意 需要一个数组来排重 在某一个爆炸点 如果爆炸的方向 和爆炸的层 ...

  5. BZOJ2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

    n<=50000个点的树,求选最多不相邻点的个数. f[i][0]=sigma max(f[j][0],f[j][1]),j为i的儿子 f[i][1]=sigma f[j][0],j同上 死于未 ...

  6. C#.net获取存储过程的Return返回值和Output输出参数值

    原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 1.获取Return返回值 程序代码//存储过程//Create PROCEDURE MYSQL//     @a ...

  7. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  8. git修改commit message及vi编辑器的简单使用

    1.修改commit信息 git commit --amend 2.进入vi编辑器修改 ‘i’进入insert模式,输入文字: ‘esc’回到命令模式,删除文字,移动光标: ‘:’进入底行模式,‘wq ...

  9. ATcoder 2000 Leftmost Ball

    Problem Statement Snuke loves colorful balls. He has a total of N×K balls, K in each of his favorite ...

  10. win10安装mysql5.6,mysql启动时,闪退

    首先在服务中查看是不是mysql启动了 发现在服务中没有mysql服务, 然后找到mysql的安装目录 MYSQL SERVER 5.6 中将my-default.ini 改为my.ini 使用命令行 ...