基础题一

摘录自2019年iOS面试反思总结

1.继承 分类 扩展

Category 分类 类别
Extension 扩展
Inheritance 继承
@ 分类有名字 类扩展没有分类名字 是一种特殊的类
@ 分类只能扩展方法(属性仅仅是声明 并没有真正实现 ) 类扩展一般用于声明私有方法 私有属性 私有成员变量
@ 继承可以增加  修改 或者删除方法 并且可以增加属性

面向对象程序设计中的类有三大特性 继承 封装 多态

Category

Category的主要作用是为已经存在的类添加方法
使用Category的好处

1.可以减少单个文件的体积
2.可以把不同的功能组织到不同的category里面
3.可以由多个开发者共同完成一个类
4.可以按需加载想要的category
5.声明私有方法

Extension

Extension 可以声明方法 属性和成员变量 一般用于声明私有方法 私有属性和私有成员变量

Extension Category 区别

1.Extension在编译器决议 是类的一部分 在编译器和头文件里面的@interface以及实现文件里的@implement一起形成一个完整的类 Extension伴随类的产生而产生 及随之一起消亡
2.Extension一般用来隐藏类的私有信息 必须有一个类的源码才能为一个类添加Extension 故无法为系统的类添加Extension 除非创建子类再添加Extension
3.Category在运行期决议 Category不需要类的源码 可以给系统提供的类添加Category
4.Extension可以添加实例变量 Category不可以
5.Category Extension 都可以添加属性 但是Category的属性不能生成成员变量和getter setter方法的实现

成员变量 实例变量 属性变量

实例变量 + 基础数据类型变量 = 成员变量

  1. 成员变量是定义在{}号中的变量 如果变量的数据类型是一个类则称这个变量为实例变量
    2.成员变量用于内部 无需和外界接触的变量 因为成员变量不会生成set get方法 所以外界无法和成员变量接触
    3.由于实例变量是成员变量的一种特殊情况 所以实例变量也是类内部使用的 无需与外界接触的变量 也就是所谓的类私有变量

属性变量是用于与其他对象交互的变量 好处是允许其他对象访问到该变量 因为属性创建过程中自动产生了set方法和get方法
类别中只能添加方法 不能添加实例变量

2.Objective-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么不要在category中重写一个类原有的方法?

OC的类不可以多继承 都是单继承 多继承可以用protocol委托代理来模拟实现 
可以实现多个接口 可以通过实现多个接口完成OC的多继承
Category是类别
重写一个类的方式用继承好还是分类好 
  - 取决于具体情况 如果目标类有许多的子类 我们需要拓展这个类又不希望影响到原有的代码 继承比较好 
  - 如果仅仅是拓展方法 分类更好(不需要涉及到原先的代码)
因为分类中方法的优先级比原先的类中的方法高 也就是说 在分类中重写了原先类中的方法 那么分类中的方法会覆盖原先类的方法
为什么不要在category中重写一个类原有的方法?
1、category没有办法去代替子类,它不能像子类一样通过super去调用父类的方法实现。如果category中重写
覆盖了当前类中的某个方法,那么这个当前类中的原始方法实现,将永远不会被执行,这在某些方法里是致命的。
(ps:这里提一下,+(void)load方法是一个特例,它会在当前类执行完之后再在category中执行。)
2.一个Category也不能可靠的覆盖领一个Category中相同的类的相同的方法(例如UIViewController+A与
UIViewController+B,都重写了viewDidLoad,我们就无法控制谁覆盖了谁)
3.通过观察头文件发现 Cocoa框架中的许多类都是通过Category来实现功能 可能不经意间这些方法中的其一,有
时候就会产生一些无法排查的异常原因
4.Category的诞生只是为了让开发者可以方便的拓展一个类 他的初衷不是让你去改变一个类

要重写方法,首推通过子类重写父类的方法,在一些不方便重写的情况下,我们也可以在category中用runtime进行method swizzling来实现。

3.什么是多态?什么是分类?什么是协议?

多态在面向对象语言中指同一个接口有多种不同的实现方法 在oc中 多态则是不同对象对同一消息的不同响应方式 
子类通过重写父类的方法来改变同一方法的实现 体现多态性
多态就是父类类型的指针指向子类的对象 在函数(方法)调用的使用可以调用到正确版本的函数(方法)
多态就是某一类事务的多种形态 继承是多态的前提
分类 在不修改原来类代码的情况下 可以给类添加方法
 - Category 给类拓展方法 或者关联属性 Categroy底层结构也是一个结构体:内部存储这结构体的名字,那个类的
分类,以及对象和类方法列表,协议,属性信息
 - 通过runtime加载某个类的所有Category数据
 - 把所有Category的方法 属性 协议数据 合并到一个大数组后面参与编译的Category数据 会在数组的前面
 - 将合并后的分类数据(方法 属性 协议) 插入到类原先数据的前面
 - 协议是一套标准 标准中声明了很多方法 但并不关心具体这些方法是怎么实现的 具体实现由遵守这个协议的类去完成
 - 在oc中 一个类可以实现多个协议 通过协议可以弥补单继承的缺陷 但是协议跟继承不一样 协议只是一个方法列表 方法的实现得遵守这个协议的类去实现

4.请说明并比较以下关键词:strong, weak, assign, copy

- strong表示指向并拥有该对象 其修饰的对象引用计数会增加1 该对象只要引用计数不为0则不会被销毁 当然强行将其设为nil可以销毁它
- weak表示指向但不拥有该对象 其修饰的对象引用计数不会增加 无需手动设置 该对象会自行在内存中销毁
- assign主要用于修饰基本数据类型 如NSInteger和CGFloat,这些数值主要存在于栈上
- weak 一般用来修饰对象 assign一般用来修饰基本数据类型 原因是assign修饰的对象被释放后 指针的地址
依然存在 造成野指针 在堆上容易造成崩溃 而栈上的内存系统会自动处理 不会造成野指针
- copy和strong类似 不同之处是strong的复制时多个指针指向同一个地址 copy的复制每次会在内存中拷贝一
份对象  指针指向不同地址 copy一般用在修饰可变对应类型的不可变对象上 如NSString, NSArray, NSDictionary
- Objective-C 中 基本数据类型的默认关键字是atomic readwrite assign 普通属性的默认关键字是atomic readwrite strong

5.用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?

@property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变
类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是
把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份
- 因为父类指针可以指向子类对象 使用copy的目的是为了让本对象的属性不受外界的影响 使用copy 无论传入的
是可变对象还是不可变对象 我本身持有的都是一个不可变的副本
- 如果我们使用的是strong 那么这个属性就有可能只需一个可变对象 如果这个可变对象在外部被修改了 那么
就会影响到该属性

使用copy的目的是 放置把可变类型的对象赋值给不可变类型的对象时 可变类型对象的值发生变化会无意间篡改不可变类型对象原先的值

1.copy出来的字符串一定是不可变字符串 如果传入的是可变字符串 会发生深拷贝为不可变字符串 否则为浅拷贝
2.mutableCopy 一定是深拷贝 拷贝出来的一定是可变字符串或数组 即使传入的是不可变字符串或者数组

6.浅拷贝和深拷贝的区别?

- 浅拷贝 只复制指向对象的指针 而不复制引用对象本身
- 深拷贝 复制引用对象本身 内存中存在了两份独立对象本身  当修改A时 A_copy不变

1.非集合类对象的copy和mutableCopy
对immutable(不可变)对象进行copy操作,是指针拷贝,mutableCopy(可变)操作时内容拷贝;对mutable对象进行copy和mutableCopy都是内容拷贝

[immutableObject copy] // 浅拷贝
[immutableObject mutableCopy] //深拷贝
[mutableObject copy] //深拷贝
[mutableObject mutableCopy] //深拷贝

2.集合类对象的copy和mutableCopy
对immutable对象进行copy,是指针拷贝,mutableCopy是内容拷贝;对mutable对象进行copy和mutableCopy都是内容拷贝

集合对象的内容拷贝仅限于对象本身 对象元素仍然是指针拷贝
[immutableObject copy] // 浅拷贝
[immutableObject mutableCopy] //单层深拷贝
[mutableObject copy] //单层深拷贝
[mutableObject mutableCopy] //单层深拷贝

image.png

深复制(单层深复制)和完全复制

深复制,就是把原有对象的内容直接克隆一份到新对象,但是这里有一个坑就是他只会复制一层对象,而不会复制第二层甚至更深层次的对象

当对数组进行copy或mutableCopy之后得到新数组 修改原先的数组中的内容 也会影响到新数组的数据 就是因为他是深复制 只复制了一层 里面的元素是指针拷贝

可以使用NSMutableArray * dataArray2 = [[NSMutableArray alloc]initWithArray:dataArray1 copyItems:YES]; 实现完全复制
前提是数组中存储的是可变数据 如果是NSArray或者NSString或NSDictionary 执行copy之后 只是指针复制 如果放入的是未实现NSCoping协议的对象 如自定义对象 调用这个方法甚至会crash 因为自定义对象没有copy方法

要想对多层对象进行复制 需要进行完全复制 可以使用归档和接档

image.png

自定义类的深浅copy

一个NSObject的对象要想使用拷贝,那么类必须实现NSCopying协议或NSMutableCopying协议
1.让类实现NSCopying/NSMutableCopying协议。
2.让类实现copyWithZone:/mutableCopyWithZone:方法

// 当对象需要调用 copy 的时候,需要调用 copyWithZone:这个方法
//写法一:这样写就是单层深复制
-(id)copyWithZone:(NSZone *)zone{
UserInfo * userInfo= [[UserInfo allocWithZone:zone] init];
userInfo.age = self.age;
userInfo.name = self.name;
userInfo.photos = self.photos;
return userInfo;
}
//写法二:这样写就是浅复制

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