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. python模块以及导入出现ImportError: No module named ‘xxx‘问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  2. Java实战及解析 — Maven快速入门

    五分钟快速入门 mvn --version mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darche ...

  3. Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)

    内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...

  4. vmware下centos6.7网络配置

    使用NAT方式: 查看/etc/sysconfig/network-script/ 下面没有ifcfg-eth0 新建ifcfg-eth0,内容如下 DEVICE=eth0 BOOTPROTO=dhc ...

  5. 框架-Jquerychange事件数值计算

    //优惠率计算优惠价            $("body").on("change", "#Rate", function() {     ...

  6. css实现文字渐变

    css文件渐变虽然兼容性比较差,但是用在移动端和chrome中还是没有问题的. 实现文件渐变的方法有两种 1. 使用 background 的属性 2. 使用 mask 属性 方式一. <!DO ...

  7. 将oracle10g 升级至10.2.0.4

    http://blog.csdn.net/launch_225/article/details/7221489 一.单实例环境,全时长一个半钟多. 详细图文说明到这下载 1.停止所有oracle相关进 ...

  8. win10 localhost 解析为::1 的解决办法

    win10 localhost 解析为::1 的解决办法 学习了:https://blog.csdn.net/ambertian/article/details/70238020

  9. Fortinet网络接入及安全方案配置步骤

    http://sec.chinabyte.com/200/12553700.shtml 1.概述: Fortinet无线接入及方案由以下两类设备组成: AC(Wifi接入控制器)及安全网关:Forti ...

  10. MySQL基础笔记(二) 完整性约束

    我们知道,一种数据模型必须包含三个基本的部分: 构造机制(数据结构):主要描述数据的类型.内容.性质以及数据间的联系等. 运算机制(数据操作):主要描述在相应的数据结构上的操作类型和操作方式. 约束机 ...