iOS开发知识点总结(二)

1.请简述你对协议的理解?

protocol无论在哪个领域都是一种约束、规范。在OC中的协议主要用于在各个类之间进行回调传值。协议有委托方、代理方。委托方是协议的制定者,需要声明协议的方法,实现协议的对象。代理方,是协议的遵守者,需要遵守协议,并实现协议中的方法。

2.如何理解ARC自动引用计数机制?

Cocoa采用了引用计数(reference counting)机制,每一个对象有一个关联的“整数retainCount”用于记录对象的使用情况。对象被引用时,retainCount+1,外部环境结束对象的使用后retainCount-1。当retainCount为0的时候,该对象被销毁。

当我们使用alloc、new或者copy的时候需要销毁这个对象。release方法,只是将对象的retainCount值减1,并不是删除对象。当retainCount==0的时候,系统会发给对象一个dealloc消息,另外:千万不要手动调用dealloc,因为我们不知道何时、何地、何人还会使用该对像。应该老老实实依赖引用计数机制完成内存管理。

释放对象所有权的函数出了release还有autorelease,这是一种延迟操作。

3.如何理解retain、copy、assign、release、autorelease、dealloc关键字?

copy:建立一个索引计数为1的对象,然后释放旧对象,主要用于NSString

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

assign:简单赋值,不更改索引计数

release:手动释放对象

dealloc:它的作用是,当对象的引用计数为0,系统会自动调用dealloc方法,回收内存。

autorelease原理:(1)先建立一个autorelease pool;(2)autorelease pool里面生成;(3)对象生成之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象;(4)程序结束时,pool本身也需要release,此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。

4.self.name与_name的区别

self.name是通过方法进行引用的,包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。

self.name是对属性的访问,而_name是对局部变量的访问。所有被声明为属性的成员,在iOS5之前需要使用编译指令@synthesize来告诉编译器帮助生成属性的getter和setter方法,之后,这个指令可以不用人为的指定了,默认情况下编译器会帮助我们生成。编译器在生成getter,setter方法是是有优先级的,它首先查找当前的类中用户是否定义属性的getter、setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.name时是调用一个getter方法,会使引用计数加1,而_name不会使引用计数加1

所以使用self.name是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在Block中造成循环引用。同时,使用 '_' 是获取不到父类的属性,因为它只是对局部变量的访问。(即点语法实际上是getter和setter方法的间接调用,下划线方法是直接对变量操作。

5.继承与类别的联系与区别

联系:

可以给一个类扩展新的方法,或修改已有的方法

区别:

(1)继承修改的方法不会对父类原方法产生影响;类别修改的方法相当于替换了原有方法

(2)以ViewController举例,继承一个ViewController相当于建立一个新的页面,而给一个ViewController添加类别用于增加或者修改原ViewController上的方法。

(3)类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

(4)针对系统提供的一些类,例如:NSString、NSArray、NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类的内部实现对继承有所限制,所以最后使用类别来进行方法扩展。

(5)理论上类别不能新增属性

6.strong与weak的区别

weak和strong的不同是:当一个对象不再有strong类型的指针指向它的时候,它会被释放,即使还要weak型指针指向它。一旦最后一个strong型指针离去,这个对象将被释放,所有剩余的weak型指针都将被清除。

7.私有API与公开API的区别

iPhone中的API出了公开的API:Published API之外(或者叫文档记录的API:Documented API),还有两类API:私有API(Private)和未公开的API(UNPublished API或者叫文档中未记录的API:UNDocumented api)。其中私有API是指放在PrivateFrameworks框架中的API,未公开的API是指虽然放在frameworks框架中,但是却没有在苹果的官方文档中有使用说明、代码介绍等记录的API。后两种API是有区别的,按苹果的说法,未公开的API是还不够成熟,可能还会变动的API,等完全成型后会变成公开的API,但是目前不对其提供承诺,就是系统版本升级后可能会失效。而私有API是苹果明确不能使用的API。虽然两者有所区别,但是在具体使用方法上是类似的。

8.#import "xxx.h"和@class+类名的区别

(1)import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

(2)在头文件中,一般只需要知道被引用的类的名称就可以了。不需要世道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

(3)在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是一次引用的,如A->B,B->C,C->D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多,这将耗费大量的时间,而用@class则不会。

(4)如果有循环依赖关系,如A->B,B->A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

所以一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要#import那个在@class中声明的类

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

推荐阅读更多精彩内容