2022-11-14 04OBJC语言特性

分类(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语言特性)