Objective-C基础语法学习笔记五

子类在内存中的存储和方法调用过程

请添加图片描述

结构体和类的区别

  1. 结构体只能封装数据,而类不仅可以封装数据还可以封装行为
    2.结构体变量分配在栈中(如果是一个局部变量)
    而对象分配在堆空间

栈的特点:空间相对较小,访问效率高
堆的特点:空间相对较大,数据访问效率低

1.类什么时候加载到代码段
类被第一次访问的时候,就会被记载到代码段这个过程称为类加载
2.类以什么样的形式存储在代码段?
a.先在代码段中创建一个Class对象,这个Class对象用于存储类对象。Class是Fundation框架中的一个类。
b.将类的信息存储在这个Class对象之中

类是以Class对象的形式存储在代码段的

3.类一旦被加载到代码段之后 什么时候回收?

4.如何得到存储在代码段中的类对象
a.调用类的类方法class就可以得到存储类的类对象地址
[Person class]
b.调用对象的对象方法 class 就可以得到存储这个对象所属的类的Class对象的地址

SEL

seletor 选择器,是一个数据类型,所以要在内存中申请空间存储数据
SEL相当一个类 SEL对象是用来存储1个方法的

如何将方法存储在类对象中?
1.先创建1个SEL对象
2.将方法的信息存储在这个SEL对象中
3.再将这个SEL对象作为类对象的属性

SEL s1 = @select(方法名);

以上代码可得到存储方法的SEL对象

请添加图片描述

调用方法的本质

1.先拿到存储sayHi方法的SEL对象,也就是拿到存储的sayHi方法的SEL数据 SEL消息
2.将这个SEL消息发送给p1对象
3.这个时候,p1对象接收到这个SEL消息以后,就知道要调用方法
4.根据对象的isa指针找到存储类的类对象
5.找到这个对象之后 在这个类对象中去搜寻是否有和传入的SEL数据相匹配的,如果有就执行 如果没有就继续找父类 知道NSObject

调用方法的本质就是为对象发送一条SEL消息

点语法

p1.age = 10 相当于 [p1 setAge:10]

int age = p1.age 相当于 int age = [p1 age]

@property

1.作用:自动生成getter和setter方法的声明
2.语法:
@property 数据类型 名称

@property 增强
只需要写一个@property编译器就会自动
1.生成私有属性
2.生成getter setter的声明
3.生成getter setter的实现

@property参数总结

1.开发程序分为ARC MRC
2.与多线程有关的参数
atomic :默认值 安全 但效率低下
nonatomic: 不安全 但效率高

无论是ARC 还是 MRC 都可以使用,建议都使用nonatomic

3.retain

只能在MRC的模式下使用,代表生成的setter方法是标准的内存管理代码

当属性的类型是OC对象的时候,绝大多数情况下使用retain。只有在出现了循环引用的时候1边retain 1边assign

4.assign:
在ARC 和MRC的模式下都可以使用assign
当属性的类型是非OC对象的时候 使用assign

5.strong:
只能使用在ARC机制下,当属性的类型是OC对象的时候,绝大多数情况下使用strong

只有出现了循环引用的时候,1端使用strong一端使用 weak

6.weak

只能使用在ARC 的机制下,当属性的类型是OC对象的时候 只有出现了循环引用的时候 1端strong 1端weak

7.readonly readwrite

两种模式都可使用

动态类型检测

静态类型动态类型
静态类型:一个指针指向的对象是一个本类对象
动态类型:一个指针指向的对象不是一个本类对象

NSObject 和 ID 指针的区别

NSObject指针的缺点:如果要调用指向的子类对象的独有方法,就必须做类型转换请添加图片描述
id指针只能调用方法,不能使用点语法

ID是无类型指针

Id和instancetype的区别
1.instancetype只能作为方法的返回值,不能在其他地方使用
id既可以声明指针变量 也可以作为参数也可以作为返回值
2.instancetype 是1个有类型的代表当前类的对象
id是个无类型指针 仅仅是个地址 没有类型的指针

//instancetype 调用方法返回值的是当前类的对象

  • (instancetype)person
    {
    //self是当前调用new方法的类
    return [self new];
    }
    请添加图片描述

1.判断对象是否有这个方法

BOOL b1 = [p1 respondsToSelector:@selector(length)];

2.判断对象是否是Person类的对象或Person类的子类对象

[p1 isKindOfClass:[Person class]]

3.判断对象是否是Person类的对象不包含其子类

[p1 isMemberOfClass:[Person class]];

4.判断Student类是不是Person类的子类
[Student isSubclassOfClass:[Person class]];

构造方法

new 是一个类方法。new方法的内部:先调用alloc方法再调用init方法。
alloc是一个类方法,作用是哪个类调用这个方法就创建哪个类的的对象,并把对象返回。
init方法是一个对象方法,作用是初始化这个对象请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值