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. Leetcode 306.累加数

    累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...

  2. MySQL数据库不识别server=.而是识别localhost

    MySQL数据库不识别server=.而是识别localhost

  3. iOS-runtime-根据类名推送到任意控制器,且实现属性传值

    // // WJRuntime.m // RuntimeSkip // // Created by tqh on 15/9/8. // Copyright (c) 2015年 tqh. All rig ...

  4. ES6关于Promise的用法详解

    Node的产生,大大推动了Javascript这门语言在服务端的发展,使得前端人员可以以很低的门槛转向后端开发. 当然,这并不代表迸发成了全栈.全栈的技能很集中,绝不仅仅是前端会写一些HTML和一些交 ...

  5. Windows的Java_HOME环境变更配置

    Windows的Java_HOME环境变更配置 一般会配置三个环境变更: 1.系统变量 变量名JAVA_HOME  变量值=安装目录,如:C:\Program Files (x86)\Java\jdk ...

  6. 逆序对数列(BZOJ 2431)

    题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样 ...

  7. 数据库备份与还原c#.net实现

    原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 数据库备份与还原c#.net实现: 页面上面有 备份,还原,下拉菜单(浏览备份文件夹下面的所有文件名),删除(删除 ...

  8. 前端的指导方针---css篇

    英语是渣渣,想学英语,又不想花钱报培训班.看不懂的文章,还是翻译一下留着自己看吧. 引自   :  https://github.com/bendc/frontend-guidelines HTML ...

  9. php装饰者模式

    php装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 示例: A.B.C编辑同一篇文章. class ...

  10. 牛客网暑期ACM多校训练营(第九场)D

    链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...