OC基础

内容要点

分类
扩展
关联对象
代理
通知
KVC
属性关键字

分类

分类可以做什么?

1 实例方法
2 类方法
3 协议
4 属性
作用是:声明私有方法,分解庞大的类文件

分类的结构如下:
struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods;
    struct method_list_t *classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
    ……
}
分类特点

1 运行时决议:编译时没有添加,运行时才通过Runtime添加
2 最后编译的类,最先添加到数组中。方法查找时,根据选择器名称查找,最优先查找头部方法。
第一步:依次编译分类A、B、C
第二步:运行时,有个二维数组,倒序添加编译过的分类(CBA)
第三步:在宿主方法列表的index=0的位置,插入二维数组中的内容


结论

分类添加的方法可以“覆盖”原类方法。
同名分类方法谁能生效取决于编译顺序,最后编译的,最优生效。
名字相同的分类会引起编译报错

扩展Extension

扩展可以做什么?

1 声明私有属性
2 声明私有方法(仅方便阅读)
3 声明私有成员变量

扩展和分类区别

1 分类是运行时决议,扩展是编译时决议
2 分类可以有声明有实现,扩展只有声明,实现写在宿主的.m中
3 可以给系统类添加分类,不能给系统类添加扩展
运行时决议:编译期并没有把分类方法添加到宿主类中,而是在运行时才添加。

关联对象

关键方法

能否为分类添加成员变量? 可以,使用关联对象

id objc_getAssociatedObject(id object, const void *key)
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
void objc_removeAssociatedObjects(id object)
关联对象的本质

所有关联对象内容都在同一个全局容器中。使用AssociationsManager 管理并在AssociationsHashMap存储。


代理Delegate

代理是一种软件设计模式,iOS中以@protocol形式实现,传递方式一对一


通知Notification

使用观察者模式来实现跨层传递消息的机制,传递方式一对多

通知本质是:一个Map,以notificationName为key找到注册的对象列表,然后遍历对象,一次调用通知方法。

KVO

1 KVO是 观察设计者模式的实现
2 Apple使用了isa 混写(isa - swizzling)来实现KVO
生效条件
1 使用setter方法改变值KVO才会生效
2 使用setValue: forKey: 改变值KVO会生效
3 成员变量直接修改需手动添加KVO才会生效(willChangeValueForKey didChangeValueForKey)

isa混写就是指改变isa的指向。假设Person对象person添加了KVO观察后,会在运行时生成一个Person的子类NSKVONotifying_Person, 那么person的isa是指向Person类的,此时会被重写,改为指NSKVONotifying_Person类。NSKVONotifying_Person类修改了setter方法。


KVC

键值编码技术 在 NSObject(NSKeyValueCoding)中定义

- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (nullable id)valueForKey:(NSString *)key;

无论调用setValue还是valueForKey,key必须是类定义的。否则会抛异常.
由于可以通过这种方式改变私有变量,所以会破坏面向对象编程思想。

setValue调用顺序

setter方法,变量,如果还是没有setValue:forUndefinedKey:抛异常

valueForKey调用顺序

getter方法,变量,valueForUndefinedKey抛异常

属性关键字

读写权限

readonly readwrite. default is readwrite

原子性

atomic(赋值,获取线程安全) nonatomic . default is atomic.
atomic修饰的数组,数组赋值与获取保证线程安全。但是数组添加,移除不负责线程安全。

引用计数

retain/strong
assign/unsafe_unretained (基本,对象)/MRC
weak
copy

assign和weak区别 ?

assign 会产生悬垂指针
不改变被修饰对象的引用计数
修饰基本数据类型,如int BOOL等
weak
不改变被修饰对象的引用计数
所修饰的对象被释放之后会自动置为nil

copy关键字

copy后的都是不可变的
mutableCopy的都是可变的
只有不可变对象的 copy是浅拷贝,其他都是深拷贝


总结

@property(copy)NSMutableArray *array?

可能会造成程序崩溃
原因是:array不管是NSMutableArray还是NSArray经过copy后,都是NSArray。
NSMutableArray经过copy是深拷贝,产了NSArray不可变对象
NSArray经过copy是浅拷贝,产生了NSArray指针。
但是由于array被声明为NSMutableArray所以,可能会调用addObject这些方法,导致崩溃。

MRC重写retain修饰变量的setter方法?

if(_obj != obj){
[_obj release];
_obj = [obj retain];
}

分类实现原理?

运行时决议,不同分类同名方法,最后参与编译的最终生效。

KVO实现原理?

观察着模式实现,运用了isa混写技术,动态添加子类。让isa指向子类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358