分类(category)
你用分类做了哪些是事情
1.声明私有方法
2.分解体积庞大的类文件
3.把framework的私有方法公开化
特点:
1.分类运行时决定(通过runtime添加)
2.可以为系统类添加分类
分类中可以添加哪些内容
1.实例方法
2.类方法
3.协议
4.属性()
5.(注意:)关联对象的方法添加实例变量
分类结构体
分类的加载调用栈
- _objc_init
2.map_2_images(镜像)
3.map_images_nolock
4._read_images(读取镜像)
5.remethodizeClass
【提问】分类有多个相同的方法,哪个会生效
最后编译的方法生效;
怎么给分类添加成员变量?
通过关联对象的技术来添加成员变量
//获取
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"
扩展(Extension)
一般扩展做什么?
1.声明私有属性
2.声明私有方法
3.声明私有成员变量
扩展特点
1.编译时决定
2.只以声明的形式存在,多是情况下寄生于宿主类的.m中
3.不能为系统类添加扩展
代理(delegate)
1.是一种软件设计模式
2.iOS当中以@protocol形式体现
3.代理1对1
通知(NSNotification)
1.通知是使用观察者模式来实现用于跨层传递消息的机制
2.传递方式是一对多
如何实现通知机制?
KVO
1.KVO- 是key-value-boserviing的缩写
2.kvo是objc-c对观察者模式的一种实现
3.apple使用isa混写技术来实现kvo
当使用kvo时,会自动生成原类A的子类,子类名称是NSKVONotifying_A,并且重写原setter方法。子类通过重写setter方法负责同志所有观察者的对象
- 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
属性关键字
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关键字区别
深拷贝和浅拷贝的区别
1.可变对象的copy和mutablecopy都是深拷贝
2.不可变对象的copy是浅拷贝,mutableCopy是深拷贝
3.copy方法返回的都是不可变对象
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)可以通过关联对象这个技术,来为宿主添加成员变量