美文网首页
2022-11-14 04OBJC语言特性

2022-11-14 04OBJC语言特性

作者: TsingQue | 来源:发表于2022-11-15 09:34 被阅读0次

分类(category)

你用分类做了哪些是事情
1.声明私有方法
2.分解体积庞大的类文件
3.把framework的私有方法公开化

特点:

1.分类运行时决定(通过runtime添加)
2.可以为系统类添加分类

分类中可以添加哪些内容

1.实例方法
2.类方法
3.协议
4.属性()
5.(注意:)关联对象的方法添加实例变量

分类结构体

image.png

分类的加载调用栈

  1. _objc_init
    2.map_2_images(镜像)
    3.map_images_nolock
    4._read_images(读取镜像)
    5.remethodizeClass
image.png

【提问】分类有多个相同的方法,哪个会生效
最后编译的方法生效;

怎么给分类添加成员变量?

通过关联对象的技术来添加成员变量

//获取
id objc_getAssociatedObject(id object,connst void *key)

//set赋值
void objc_setAssociatedObject(id object, constt void *key , id value , objc_ASSOCIATionPolicy)

//删除
void objc_removeAssociatedObjects(id object)

成员变量被添加到哪里了呢?

1.肯定没有添加到原宿主类上

关联对象的本质!
关联对象由AssociationManager管理并在AssociationsHashMap存储
所有对象的关联内容都存储在【全局容器中】;

例子:
AssociationHashMap 结构
key --> DISGUISE(obj)
value -->ObjcAssociationMap

----->>
ObjcAssociationMap 结构
key --> @selector(text)
value -->ObjcAssociation

----->>
ObjcAssociation数据结构
OBJC_ASSOCIATION_COPY_NONATOMIC
@"Hello"

image.png

扩展(Extension)

一般扩展做什么?
1.声明私有属性
2.声明私有方法
3.声明私有成员变量

扩展特点

1.编译时决定
2.只以声明的形式存在,多是情况下寄生于宿主类的.m中
3.不能为系统类添加扩展

代理(delegate)

1.是一种软件设计模式
2.iOS当中以@protocol形式体现
3.代理1对1

image.png

通知(NSNotification)

1.通知是使用观察者模式来实现用于跨层传递消息的机制
2.传递方式是一对多

如何实现通知机制?

image.png

KVO

1.KVO- 是key-value-boserviing的缩写
2.kvo是objc-c对观察者模式的一种实现
3.apple使用isa混写技术来实现kvo

image.png

当使用kvo时,会自动生成原类A的子类,子类名称是NSKVONotifying_A,并且重写原setter方法。子类通过重写setter方法负责同志所有观察者的对象

image.png
  • willValuechangeforkey
  • didiValuechangeforkey
    重写setter方法

1.通过kvc设置value能否生效?
可以生效

2.通过成员变量直接赋值value能否生效?

KVO

1.使用setter方法改变值kvo才会生效
2.使用setvalue:forkey:改变值kvo才生效
3.成员变量直接修改需手动添加kvo才生效

KVC

kev是key-value-coding
1.-(id)valueforkey:(NSString *)key
2.-(void)setvalue:(id)value forkey:(NSString *)key

image.png

属性关键字

1.读写权限
2.原子性
3.引用计数

读写

readonly readwrite

原子性

1.atomic
对成员属性的获取和赋值是线程安全的!但是并不代表对变量进行操作安全。
2.nonatomic

引用计数

1.retain/strong
retain在mrc中使用,strong在arc中使用
2.assign/unsafe_unretained
3.weak,copy

assign
1.修饰基本数据类型,如int,bool
2.修饰对象类型时,不改变其引用计数
3.会产生悬垂指针;(在被释放时候,仍然指向原来的对象地址,这个时候,如果我们通过assign指针继续访问原对象的话,可能会因为悬垂指针的原因导致内存泄漏,或者程序异常)

weak
1.不改变被修饰对象的引用计数
2.所指对象在被释放之后会自动设置为nil

copy

使用copy修饰NSMutableArray会有什么问题呢?
1.如果赋值过来的是NSMutableArray,copy之后是NSArray
2.如果赋值过来的是NSArray,copy之后是NSArray

那么此时我们对NSMutableArray进行add,remove操作就会引起程序的异常

浅copy

1.浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间

深copy

深拷贝让目标对象指针和源对象指针指向两片内容相同的内存空间
特点
1.不会增加拷贝对象的引用计数
2.深拷贝让目标对象指针和源对象指针指向两片内容相同的内存空间

copy关键字区别


image.png

深拷贝和浅拷贝的区别

1.可变对象的copy和mutablecopy都是深拷贝
2.不可变对象的copy是浅拷贝,mutableCopy是深拷贝
3.copy方法返回的都是不可变对象

image.png

1.MRC下如何重写retain修饰变量的setter方法
@property (nonatomic, retain)id obj;

- (void)setObj:(id)obj {
///防止异常的处理
    if (_obj != obj) {
        [_obj releas];
        _obj = [obj retain]
    }
}

2.请简述分类的实现原理
(1)分类的实现原理是由运行时决定的
(2)不同分类中含有同名方法谁最终生效,取决于谁最后参与编译,最终参与编译的分类的同名方法会最终生效
(3)分类中的存在与宿主类同名的方法,那么分类中的方法会覆盖同名的宿主类方法;这里所说的覆盖是由于消息查找时候会优先处理数组靠前的方法。但是其实宿主类的方法其实还是存在的,我们可以通过一些手段调取到宿主类的方法。

3.KVO的实现原理是怎么样的?
(1)kvo是系统对于观察者模式的一种实现
(2)kvo运用了isa混写技术;对于某个类重写他的子类,并且重写他的setter方法,使得原有类的isa指针指向新创建的这个类上面

4.能否为分类添加成员变量?
(1)可以通过关联对象这个技术,来为宿主添加成员变量

相关文章

  • 2022-11-14 04OBJC语言特性

    分类(category) 你用分类做了哪些是事情1.声明私有方法2.分解体积庞大的类文件3.把framework的...

  • 强大自己是解决问题的唯一方法

    2022-11-14 如题

  • 0376|觉察日记

    2022-11-14 北京 天冷冷。 #200字小分队 不负热爱 子芳老师说,要把《爱的五种语言》先运用在我们自己...

  • 【课程笔记】南大软件分析课程12——Soundiness(课时1

    目录 Soundness & Soundiness 复杂语言特性一:Java Reflection 复杂语言特性二...

  • 语言特性

    王垠在如何掌握所有的程序语言这篇文章写的很好,我再次受到启发,这是李笑来说提倡的「概念」在编程领域的应用。 王垠不...

  • Java 8 新特性介绍

    Java 8 新特性介绍 新特性分类 语言功能增加特性 API 类库 平台和虚拟机 周边工具 语言功能增加特性 函...

  • 我理解的runtime

    OC Runtime 对OC的理解与特性 OC是一门面向对象语言,既有静态语言的特性(C++),又有动态语言的特性...

  • 面试总结

    OC的理解与特性 . OC是一门面向对象的语言,三大特性:封装 继承 多态。静态语言特性(C++),动态语言的效率...

  • ios基础知识MS2

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...

  • 知识点总结1

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...

网友评论

      本文标题:2022-11-14 04OBJC语言特性

      本文链接:https://www.haomeiwen.com/subject/cnxrxdtx.html