六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法
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.自定义构造方法的更多相关文章
- 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...
- c++ :OOP之静态类型与动态类型
所谓静态类型即类型指针或引用的字面类型:而动态类型即类型指针或引用的实际类型. 这一对概念一般发生在基类和派生类之间. 如: class Base { ..... } class Derived : ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- OC基础--构造方法 id类型
new方法实现原理: new做了三件事情 1.开辟存储空间 + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- OC基础-day06
#pragma mark - Day06_01_点语法 1. 点语法. 1). 如果要访问对象的属性,还要去调用属性对应的setter getter方法.好烦躁好烦躁. 2). 点语法的作用: 快速调 ...
- OC 动态类型,动态绑定,动态加载
OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...
- OC基础(11)
构造方法 自定义构造方法 继承中的自定义构造方法 自定义类工厂方法 *:first-child { margin-top: 0 !important; } body > *:last-child ...
随机推荐
- Web前端静态页面示例
目录结构: Web25\ |—css\ reset.css.common.css.index.css.login.css.reg.css |—js\ jquery-3.3.1.js.index.js. ...
- linux shell管道和xargs的区别
如上图,加了xargs的话相当于将上一个操作的结果作为命令执行前的操作,不加的话直接先把后面的命令运行一遍再操作
- The more, The Better(树形DP)
Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有 ...
- hdu 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
- 使用WaveOut API播放WAV音频文件(解决卡顿)
虽然waveout已经过时,但是其api简单,有些时候也还是需要用到. 其实还是自己上msdn查阅相应api最靠谱,waveout也有提供暂停.设置音量等接口的,这里给个链接,需要的可以自己查找: h ...
- hdu3622:Bomb Game
给n<=100对点,从每对点里面挑一个并以这些挑出的点为圆心画圆,并且这些圆不能互相覆盖,找出一种方案使得这些圆半径中最小的那个最大. “最小值最大”就是二分答案啦!考虑现在每个点都画出半径x的 ...
- hdu 4043 FXTZ II [ 概率 + Java大数]
传送门 FXTZ II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- ThinkPHP5 的入门学习
与Tp3.2相比,有一下的不同: (1)目录名称的改变: tp3.2的目录命名首字母皆为大写,例如:Application.Public.Controller.Model.View.ThinkPHP. ...
- 一份关于webpack2和模块打包的新手指南(一)
webpack已成为现代Web开发中最重要的工具之一.它是一个用于JavaScript的模块打包工具,但是它也可以转换所有的前端资源,例如HTML和CSS,甚至是图片.它可以让你更好地控制应用程序所产 ...
- 洛谷——P2068 统计和
P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...