第十七章、拓展一之基本问题

一、Swift与OC的区别?

SwiftObjective-C共用一套运行时环境。两者可以互相引用混合编程。其次就是,OC之前积累的很多类库,在Swift中大部分依然可以直接使用。OC出现过的绝大多数概念,比如引用计数、ARC、属性、协议、接口、初始化、扩展类、命名参数、匿名函数等,在Swift中继续有效。Swift大多数概念与OC一样。当然Swift也多出了一些新兴概念,这些在OC中是没有的,比如范型、元组等。

其实到现在为止Swift离完全替代Objective-C还是很遥远,因为Apple内部一直在用 Objective-C来做一些Framework的开发,底层也不可能用Swift实现,所以现在更多的替代是体现在外部开发。

优点:
1、Swift容易阅读,语法和文件结构简易化。
2、Swift更易于维护,文件分离后结构更清晰。
3、Swift更加安全,它是类型安全的语言。
4、Swift代码更少,简洁的语法,可以省去大量冗余代码。
5、Swift速度更快,运算性能更高。

缺点:
1、版本不稳定,之前升级Swift3大动刀
2、使用人数比例偏低,目前还是OC的天下
3、社区的开源项目偏少,毕竟OC独大好多年,很多优秀的类库都不支持Swift,不过这种状况正在改变,现在有好多优秀的Swift的开源类库了
4、公司使用的比例不高,很多公司以稳为主,还是在使用OC开发,很少一些在进行混合开发,更少一些是纯Swift开发
5、偶尔开发中遇到的一些问题,很难查找到相关资料,这是一个弊端
6、纯Swift的运行时和OC有本质区别,一些OC中运行时的强大功能,在纯Swift中变无效了
7、对于不支持Swift的一些第三方类库,如果非得使用,只能混合编程,利用桥接文件实现

二、OC是动态语言?Swift为静态语言?

1、动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Objective-C、C#、JavaScript、PHP、Python、Erlang

2、静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++

三、如何理解OC是一门动态语言

https://blog.csdn.net/wangsongyang617/article/details/79550045

四、runtime的消息传递机制

首先,runtime系统会把方法调用转化为消息发送,即objc_msgSend,并且把方法的调用者、方法选择器,当做参数传递过去.
此时,方法的调用者会通过isa指针来找到其所属的类,然后在cache或者methodLists中查找该方法,找得到就跳到对应的方法去执行。
如果在类中没有找到该方法,则通过super_class往上一级超类查找(如果一直找到NSObject都没有找到该方法的话,这种情况,我们放到后面消息转发的时候再说)。

runtime中维护了一个SEL的表,这个表存储SEL不按照类来存储,只要相同的SEL就会被看做一个,并存储到表中。在项目加载时,会将所有方法都加载到这个表中,而动态生成的方法也会被加载到表中。

简单讲,对象根据方法编号SEL去映射表查找对应的方法实现。

五、__block和__weak?

  • __block

对被截获变量进行赋值操作需要添加__block修饰符。__block修饰的变量最终变成了对象。__block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil。另外一点就是__block修饰的变量在block内外都是唯一的,要注意这个特性可能带来的隐患。

1、__block对象在block中是可以被修改、重新赋值的。
2、__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。

- (void)test0506_1
{
    __block NSMutableArray *array;
    void(^Block)(void) = ^{
        array = [NSMutableArray array];
    };
    Block();
}
  • __weak

本身是可以避免循环引用的问题的。但是其会导致外部对象释放了之后,block内部也访问不到这个对象的问题,我们可以通过在block内部声明一个__strong的变量来指向 weakObj,使外部对象既能在block内部保持住,又能避免循环引用的问题。

使用了__weak修饰符的对象,作用等同于定义为weak的property。自然不会导致循环引用问题,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。

更多详情__block 与 __weak的区别理解

六、为什么在Block里面不加__block不允许更改变量?

我们可以发现,系统自动给我们加上的注释,bound by copy,自动变量val虽然被捕获进来了,但是是用 __cself->val来访问的。Block仅仅捕获了val的值,并没有捕获val的内存地址。所以在__main_block_func_0这个函数中即使我们重写这个自动变量val的值,依旧没法去改变Block外面自动变量val的值。

OC可能是基于这一点,在编译的层面就防止开发者可能犯的错误,因为自动变量没法在Block中改变外部变量的值,所以编译过程中就报编译错误。

七、为什么自动变量的值没有增加,而其他几个变量的值是增加的?自动变量是什么状态下被block捕获进去的?

自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并非内存地址,所以Block内部不能改变自动变量的值。Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量。

1、静态全局变量,全局变量由于作用域的原因,于是可以直接在Block里面被改变。他们也都存储在全局区。
2、静态变量传递给Block是内存地址值,所以能在Block里面直接改变值。

八、为什么block能捕获变量

__block将变量包装成对象,然后在把捕获到的变量封装在block的结构体里面,block内部存储的变量为结构体指针,也就可以通过指针找到内存地址进而修改变量的值。

九、load和initialize的区别

load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

相同点在于:方法只会被调用一次。

十、关联对象为分类实现的添加对象,对象添加到哪里了?

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

十一、了解关联对象的本质

AssociationsManager
AssociationsHashMap --> object
ObjectAssociationMap --> key
ObjectAssociation --> value、policy
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)

例子说明:

- (void)setSex:(NSString *)sex
{
    objc_setAssociatedObject(self, @selector(sex), sex, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

self也就是person对象被赋给了AssociationHashMap的key,而@selector(sex)的地址被赋给了ObjectAssociationMapkey,策略OBJC_ASSOCIATION_COPY_NONATOMIC被赋值给了ObjectAssociationpolicy,传递进来的值sex被赋值给了ObjectAssociationvalue

这种设计的巧妙之处就在于:

当一个person对象不光有一个属性值要关联时,比如我们要关联heightsex这两个属性时,我们以person对象作为key,然后值是AssociationMap这个字典类型,在这个字典类型中,分别使用@selector(sex)@selector(height)作为key,然后分别利用sex属性的policy和传递进来的valueheight属性的policy和传递进来的value生成ObjectAssociation作为value。而如果有多个person对象需要关联时,我们只需要在AssociationHashMap中创造更多的键值对就可以解决这个问题。

通过这个过程我们也能明白:
关联对象的值它不是存储在自己的实例对象的结构中,而是维护了一个全局的结构AssociationManager

更多请参考Category的本质<三>关联对象

十二、TCP为什么三次握手、四次释放?

十三、项目中有没有用到runtime?怎么使用的?

十四、iOS中成员变量、实例变量、属性区分

@interface  MyViewController :UIViewController
{
    UIButton *yourButton;
    int count;
    id data;
}
@property(nonatomic, strong) UIButton *myButton;
@end
  • 成员变量

{ }中所声明的变量都为成员变量。yourButton、count、data都是成员变量。
成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。

  • 实例变量

实例变量本质上就是成员变量。只是实例是针对类而言,实例是指类的声明。

  • 属性变量

根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量。
你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。myButton是属性变量。

综上所述可知:
成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

十五、TCP连接与轮询拉取数据有什么区别?

十六、自我介绍

十七、简单介绍一下自己的项目

十八、iOS开发中的几种设计模式

目前常用的几种设计模式:代理模式、观察者模式、MVC模式、单例模式、策略模式、工厂模式、MVVM

https://www.cnblogs.com/wangbinios/p/7882082.html

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,083评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,729评论 2 9
  • 参考资源《swifter》https://github.com/iOS-Swift-Developers/Swif...
    柯浩然阅读 1,426评论 0 6
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,771评论 1 10
  • 1 in (1)定位:图片社交类软件。准确来说是由工具型(吸引种子用户,及用户粘度)向社交型(用户变现及用户量爆发...
    Vivian弯弯阅读 553评论 0 0