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. jquery取当前节点的上级ID

  2. [Go]条件语句

    package main import ( "io/ioutil" "fmt" ) //条件语句 //if的条件语句不需要括号 //if的条件里可以赋值,if的 ...

  3. 希尔排序(shell)

    希尔排序: 思路: 希尔排序是插入排序的一种改进的版本. 先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序. 这里增量序 ...

  4. php责任链模式

    php 责任链模式 又叫职责链模式.包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的 ...

  5. vagrant的学习 之 打包分发

    vagrant的学习 之 打包分发 一.打包Box: (1)关闭虚拟机. vagrant halt (2)打包: vagrant package 这样打包出来的文件叫package.box. 指定生成 ...

  6. Java线程的5种状态及切换(透彻讲解)

    http://blog.csdn.net/pange1991/article/details/53860651

  7. POJ 1780 【手工递归】【欧拉回路】

    题意: 1.提供密码的位数. 2.密码的输入可以一直保持,取后n位作为密码.如果密码正确则开锁. 3.设计一种方法使得在输入最少的情况下破译.(即保证每个密码只输入一次) 4.输出输入的数字的序列. ...

  8. 转:浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

  9. 搜索引擎keyword智能提示的一种实现

    问题背景 搜索关键字智能提示是一个搜索应用的标配.主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,以提升用户搜索体验. 美团CRM系统中存在数以百万计的商家,为了让用户高速查找到目标 ...

  10. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

    之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...